2013-11-08 6 views
4

Как проверить, если переменные содержат символы (регулярные выражения)других чем 0-9a-z и - в чистом Баше?Bash: проверить, если строка содержит символы в регулярных выражениях шаблона

Мне нужна условная проверка. Если строка содержит символы, отличные от принятых символов, просто exit 1.

+2

, что о ', если [[ "$ строка"= ~ [^ а-z0-9-]]]; затем выйти 1; иначе эхо все отлично; fi' –

ответ

2

Один из способов сделать это с помощью команды grep, как это:

grep -qv "[^0-9a-z-]" <<< $STRING 

Затем вы просите grep возвращаемого значения со следующим:

if [ ! $? -eq 0 ]; then 
    echo "Wrong string" 
    exit 1 
fi 

Как @mpapis отметил, вы можете упростить вышеуказанное выражение:

grep -qv "[^0-9a-z-]" <<< $STRING || exit 1 

Также вы можно использовать оператор Баша =~, как это:

if [[ ! "$STRING" =~ [^0-9a-z-] ]] ; then 
    echo "Valid"; 
else 
    echo "Not valid"; 
fi 
+2

вы можете также 'grep ... || exit 1' – mpapis

+0

Нужно ли избегать '-' в' [^ 0-9a-z-] ', поэтому' [^ 0-9a-z \ -] '? Кроме того, это не первый случай 'echo 'Недействительный' 'вместо' echo' Valid "'. – Justin

+0

Нет, вам не нужно избегать '-' (даже в' 'grep' -решении), первый случай должен быть' Valid', потому что условие отрицается (используя оператор '!' Перед тестом regex) , условие спрашивает, содержит ли '$ STRING' символ, который ** не ** цифра,' -' или буква, если это оценивается как 'false' (' $ STRING' содержит только буквы, цифры и/или ' -') отрицание превращает оценку 'true' – higuaro

2

case имеет поддержку для согласования:

case "$string" in 
    (+(-[[:alnum:]-])) true ;; 
    (*) exit 1 ;; 
esac 

формат не является чистым регулярным выражением, но он работает быстрее, чем отдельный процесс с grep - что важно если у вас будет несколько проверок.

0

Используя замену двигателя Bash, чтобы проверить, если $ Foo содержит $ бар

bar='[^0-9a-z-]' 
if [ -n "$foo" -a -z "${foo/*$bar*}" ] ; then 
    echo exit 1 
fi 
Смежные вопросы