当执行下面的代码时,如果在我的电脑上检测到,但当我在办公室电脑上执行相同的命令时,如果没有检测到,这种模棱两可的行为可能是什么原因
$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
包含i
或f
,则可以解释差异:
$ 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
以获得相同的效果。