Регулярные выражения в сценарии оболочки 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, если совпадений не найдено.