Bash grep-c使用set-e在不匹配时终止脚本

Bash grep-c使用set-e在不匹配时终止脚本,bash,grep,Bash,Grep,基本示例: #!/bin/bash set -e set -x NUM_LINES=$(printf "Hello\nHi" | grep -c "How$") echo "Number of lines: ${NUM_LINES}" # never prints 0 输出: ++ grep -c 'How$' ++ printf 'Hello\nHi' + NUM_LINES=0 如果有匹配项,它将打印正确的行数。另外,grep“How$”|wc-l工作,而不是使用grep-c“How$

基本示例:

#!/bin/bash
set -e
set -x

NUM_LINES=$(printf "Hello\nHi" | grep -c "How$")
echo "Number of lines: ${NUM_LINES}" # never prints 0
输出:

++ grep -c 'How$'
++ printf 'Hello\nHi'
+ NUM_LINES=0

如果有匹配项,它将打印正确的行数。另外,
grep“How$”|wc-l
工作,而不是使用
grep-c“How$”

当grep“失败”时,您可以通过运行
来抑制grep的退出代码<代码>:始终成功

NUM_LINES=$(printf "Hello\nHi" | grep -c "How$" || :)

你自己写的
set-e
,不是吗?这就是
set-e
所做的;如果命令在非条件上下文中返回非零退出代码,它将终止脚本。@AlexP I执行了。但它不应该返回非零的退出代码?我希望grep-c“How$”和grep“How$”wc-l是等价的。在SHILCHECK的建议中,我尝试了第一个:SC2126:考虑使用GRP-C代替GRPY-WC-L. <代码> GRP手册页说:“如果选择一行,退出状态为0,如果没有选择行,则为1,如果出现错误,则为2”。失败和实际错误,这是不使用它的原因之一。