我希望grep
获取字符串,如果匹配则剪切字段。问题是,无论是否匹配,命令$?
的输出都是0,这很奇怪。请参阅下面的输出:
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $R
test
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $?
0
如您所见,匹配但$?
为0.现在请看:
$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $R
$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $?
0
此处,g09无法匹配,但$?
仍为0.为什么?
答案 0 :(得分:5)
$?
是整体或最终退出状态。你需要看的是一个名为:
PIPESTATUS
它为您提供单个管道命令的状态。
所以对你而言:
read str < <(grep g09 tor.sh | cut -d ' ' -f2`)
echo ${PIPESTATUS[0]}
1
此处1
表示管道中第一个grep命令失败。
PS:请注意我们正在使用流程替换,而不是命令替换,以便能够在当前shell中正确设置PIPESTATUS
。
示例:强>
read str < <(grep 'bar' <<< 'foo bar baz' | cut -d ' ' -f2)
echo ${PIPESTATUS[0]}
0
read str < <(grep 'cat' <<< 'foo bar baz' | cut -d ' ' -f2)
echo ${PIPESTATUS[0]}
1
在第一个示例中,grep
成功运行,因此当${PIPESTATUS[0]}
无法找到任何内容时,我们会将1
设为0,但在第二个示例中为grep
。