有谁能看到这里的错误?如果我将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
这似乎再次正常
答案 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