2012-03-01 4 views
1

Я не умею правильно использовать регулярное выражение в bash, я получил ошибку, пытающуюся сделать это таким образом, что не так в этой регулярной проверке?Проверка параметра Bash с использованием regex

#!/bin/bash 

if [ ! $# -eq 1 ]; then 
     echo "Error: wrong parameters" 
else 
     if [ $1 =~ "[a-z]" ]; then 
       echo "$1: word" 
     elif [ $1 =~ "[0-9]" ]; then 
       echo "$1: number" 
     else 
       echo "$1: invalid parameter" 
     fi 
fi 
+0

Для простой проверки, как это, рассмотрите 'case'. 'case $ 1 in * [! A-Za-z0-9] *) echo недействителен ;; * [A-za-z] *) echo word ;; '') echo empty ;; *) номер эха ;; esac' – tripleee

ответ

10

Я переработал сценарий и получить ожидаемый результат со следующим:

#!/bin/bash                                              
    if [ ! $# -eq 1 ]; then 
    echo "Error: wrong parameters" 
    else 
    if [[ $1 =~ ^[a-z]+$ ]]; then 
     echo "$1: word" 
    elif [[ $1 =~ ^[0-9]+$ ]]; then 
     echo "$1: number" 
    else 
     echo "$1: invalid parameter" 
    fi 
    fi 

Вам не нужно указать ваш Regex.

+3

Более того, вы не должны указывать регулярное выражение: из man-страницы: «Любая часть шаблона может быть процитирована, чтобы заставить ее соответствовать строке» –

-1

Используйте два кронштейна:

if [[ "$1" =~ [a-z] ]] ; then 
+0

Я все еще получаю «недопустимый параметр» –

+0

+1 для ответа сначала, но DO удаляет цитаты из регулярного выражения. – anubhava

+1

достаточно справедливо :-D – asf107

5

Don't quote the regex, и использовать двойные скобки:

[[ "$1" =~ [a-z] ]] 

Это не является строго необходимым процитировать переменной в данном конкретном случае, но это не больно, и это хорошая практика всегда указывать строки, которые содержат переменные из-за очень, очень многочисленных ловушек, связанных с word splitting.

+0

Thanks l0b0, это работает, можете ли вы объяснить, почему эти две скобки? –

+2

В двойных скобках указывается специфичная для bash [условная конструкция] (http://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs), которая реализует оператор соответствия регулярному выражению '= ~' –

+0

Ok , спасибо Гленн. –

Смежные вопросы