2014-01-03 3 views
0

Не может быть понятно, что здесь произошло? Если я поместил X | 9 в lan.db (или любой db в этом каталоге) и запустил следующий код, оператор IF не работает. Это странно! если вы эхом $ LINE, это действительно вытаскивает X | 9 из lan.db (или любой db в этом каталоге) и устанавливает его равным LINE, но он не будет сравнивать.Bash while loop if statment

DBREGEX="^[0-9]|[0-9]$" 
shopt -s nullglob 
DBARRAY=(databases/*) 
i=0 
for i in "${!DBARRAY[@]}"; do 
    cat ${DBARRAY[$i]} | grep -v \# | while read LINE; do 
     echo "$LINE" (Whats weird is that LINE DOES contain X|9) 
     if [[ !($LINE =~ $DBREGEX) ]]; then echo "FAIL"; fi 
    done 
done 

Если же я просто послал вручную ЛИНИЯ = «X | 9» и тот же код (минус пока) работает отлично. т.е. LINE = X | 9 не выполняется, но LINE = 9 | 9 преуспевает.

DBREGEX="^[0-9]|[0-9]$" 
Comment shopt -s nullglob 
Comment DBARRAY=(databases/*) 
Comment i=0 
Comment for i in "${!DBARRAY[@]}"; do 
Comment  cat ${DBARRAY[$i]} | grep -v \# | while read LINE; do 
       LINE="X|9" 
       if [[ !($LINE =~ $DBREGEX) ]]; then echo "FAIL"; fi 
Comment  done 
Comment done 

* UPDATE *

UGH сдаюсь

сейчас даже этого не работает ...

DBREGEX="^[0-9]|[0-9]$" 
LINE="X|9" 
if [[ ! $LINE =~ $DBREGEX ]]; then echo "FAIL"; fi 

* UPDATE *

Ok , поэтому он выглядит как я должен бежать |

DBREGEX="^[0-9]\|[0-9]$" 
LINE="9|9" 
echo "$LINE" 
if [[ ! $LINE =~ $DBREGEX ]]; then echo "FAIL"; fi 

Это, кажется, хорошо работать снова

ответ

1

| имеет особое значение в регулярном выражении. ^[0-9]|[0-9]$ означает, что «начинается цифрой или заканчивается цифрой». Если вы хотите соответствовать вертикальной полосе букв, обратная косая черта:

DBREGEX='^[0-9]\|[0-9]$' 
for LINE in 'X|9' '9|9' ; do 
    echo "$LINE" 
    if [[ ! $LINE =~ $DBREGEX ]] ; then echo "FAIL" ; fi 
done 
+0

Спасибо. Я наконец-то понял. Дал вам кредит. – Atomiklan

1

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

Попробуйте этот скрипт вместо:

while read LINE; do 
    echo "$LINE" 
    [[ "$LINE" =~ $DBREGEX ]] && echo "PASS" || echo "FAIL" 
done < <(grep -v '#' databases/lan.db) 
+1

Спасибо, я тоже принял ваш совет. – Atomiklan