Bash while循环if语句

时间:2014-01-03 16:08:00

标签: bash if-statement while-loop

有谁能看到这里的错误?如果我将X | 9放在lan.db(或此目录中的任何数据库)中并运行以下代码,则IF语句不起作用。有点奇怪!如果你回显$ LINE,它确实从lan.db(或这个目录中的任何数据库)中拉出X | 9并将其设置为等于LINE,但它不会进行比较。

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

但是,如果我只是手动发送LINE =“X | 9”,相同的代码(减去while)工作正常。即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

*更新*

我已经放弃了

现在连工作都没有......

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

*更新*

好的,所以看起来我必须逃避|

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

这似乎再次正常

2 个答案:

答案 0 :(得分:1)

在正则表达式评估中,您不需要圆括号。你的脚本也在创建一个子shell,并且可以避免使用cat。

请尝试使用此脚本:

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

答案 1 :(得分:1)

|在正则表达式中具有特殊含义。 ^[0-9]|[0-9]$表示&#34;以数字开头,或以数字&#34;结尾。如果要匹配文字垂直条,请反斜杠:

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