grep如果有匹配,我想要一个字符串并剪切一个字段.问题是,无论是否匹配,命令的输出$?都是0,这很奇怪.请参阅下面的输出:
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $R
test
$ R=`grep g09 tor1.sh | cut -d ' ' -f2`
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
如你所见,有一个匹配但是$?为0.现在看到这个:
$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $R
$ R=`grep g09 tor.sh | cut -d ' ' -f2`
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
在这里,g09没有匹配但$?仍为0.为什么?
$?是整体或最终退出状态.你需要看的是一个名为的bash数组:
PIPESTATUS
Run Code Online (Sandbox Code Playgroud)
这为您提供了单个管道命令的状态.
所以对你来说:
read str < <(grep g09 tor.sh | cut -d ' ' -f2`)
echo ${PIPESTATUS[0]}
1
Run Code Online (Sandbox Code Playgroud)
这1意味着管道中第一个grep命令失败.
PS:请注意我们正在使用进程替换,而不是命令替换,以便能够PIPESTATUS在当前shell中正确设置.
例:
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
Run Code Online (Sandbox Code Playgroud)
在第一个例子中grep成功运行,因此我们得到${PIPESTATUS[0]}0但1在第二个例子grep中找不到任何东西.