Регулярные выражения в сценарии оболочки tcsh

У меня есть сценарий оболочки в tcsh, которому я передаю аргумент, длина которого может варьироваться. Возможными значениями аргумента являются буквы -c,s,i,q,a. а также комбинация этих букв. (например: cs,si,ca,iq,qa,csq,acs,csia .. и т. д.). Порядок букв не имеет значения. Моя проблема заключается в проверке аргумента для любого символа, кроме этих 5, и если любой из допустимых символов появляется более одного раза (нулевое время в порядке). Скрипт должен проверить оба условия и выдать ошибку. Есть ли регулярное выражение, которое я могу использовать с оператором if для этой цели?

2 ответа

Вот пример кода, который вы можете использовать. Использование "X" означает, что сравнение должно быть строкой.

#!/bin/csh -f
if ( $#argv > 0 ) then
    echo arg is $1
    if ( X$1 =~ X-* ) then
        echo "we have an argument"
        if ( "X$1" =~ X-c[aeiou] ) then
            echo I found -c followed by vowel
        else if ( "X$1" =~ "X-c" ) then
            echo I found -c alone
        else
            echo I found a -c but not a valid combo
        endif
   else
        echo I found an unknown argument: $1
   endif
endif

Это будет проще всего сделать с помощью двух проверок регулярных выражений, одна для проверки правильности всех букв, а другая - для поиска дубликатов.

Посмотрите на этот код:

#!/bin/tcsh

echo $1 | grep -q -e "[^csqai]"
if ( $? != 0 ) then
    echo "Valid characters"
else
    echo "Invalid characters"
endif

echo $1 | grep -q -e "\([csqai]\).*\1"
if ( $? != 0 ) then
    echo "No repeated valid characters"
else
    echo "Repeated valid characters"
endif

Первое регулярное выражение ищет все недопустимые символы, а второе ищет повторяющиеся символы

Я не знаю, как сделать эти проверки в tcshпоэтому я сделал их с grep, -q флаг делает grep молчит. $? 0, если совпадений не найдено.

Другие вопросы по тегам