为什么 grep 在我的家庭电脑和办公室电脑上表现不同

为什么 grep 在我的家庭电脑和办公室电脑上表现不同

当执行下面的代码时,如果在我的电脑上检测到,但当我在办公室电脑上执行相同的命令时,如果没有检测到,这种模棱两可的行为可能是什么原因

$p 是一行文本文件, xyzxyz if ( abc ) 我使用 while read 将行传递给 grep

grep -qw -e 'if(' -e 'if' <<< $p
if [ $? -ne 0 ]; then

do something

fi

答案1

旧版本bash有那个错误/错误功能

 cat <<< $var

的内容$var将进行分词(但不是通配符),并且生成的单词会与空格连接,然后放入临时文件集中作为命令的输入cat

<<<这是在 bash-4.4 中修复的,以便与支持该zsh 操作符的其他 shell 保持一致。

对于旧版本,这是您需要引用变量的另一种情况。

因此,如果$IFS包含if,则可以解释差异:

$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if

无论如何,请注意, 是-e 'if('多余的,因为如果文本包含if(一个单词,它也包含一个if单词。

另请注意,bash内置正则表达式匹配,因此您始终可以执行以下操作

re='\<if\>'
if [[ $p =~ $re ]]; then
  printf '"%s" contains a "if" word\n' "$p"
fi

(至少在像 Linux Mint 和 RHEL 这样​​的系统上,ERE 有这些\<, \>,但如果您grep支持-w,那么 ERE 很可能也会有\<\>)。

(上面是非常罕见的情况之一,$p不需要引用(尽管引用不会造成伤害),并且$re 一定不被引用(否则其内容不被视为正则表达式,而是被视为固定字符串))

使用标准sh语法,您还可以执行以下操作:

case +$p+ in
  (*[^[:alnum:]_]if[^[:alnum:]_]*)
    printf '"%s" contains a "if" word\n' "$p"
esac

以获得相同的效果。

相关内容