我想检查管道传送到另一个命令的grep
命令的输出。在我之前的question中,建议使用PIPESTATUS,但现在我发现它并不能完全适用于所有条件。无论grep
(匹配或不匹配)的输出是什么,PIPESTATUS
都会返回0,这很奇怪。
脚本包含
GF=`grep g09 $INP | cut -d ' ' -f2`
if [ ${PIPESTATUS[0]} = 1 ]; then
基本上,第一个命令在输入文件中搜索g09
。如果它不存在,则PIPESTATUS应为1
。
现在在bash脚本中起诉set -x
,我看到对于包含g09的输入文件,输出为0,对于没有g09的输入,输出仍为0
++ grep g09 tor.sh
++ cut -d ' ' -f2
+ GF=hashe.gjf
+ '[' 0 = 1 ']'
和
++ grep g09 tor.sh
++ cut -d ' ' -f2
+ GF=
+ '[' 0 = 1 ']'
为什么呢?我该如何解决这个问题?除了PIPESTATUS之外还有其他解决方案吗?
答案 0 :(得分:3)
为什么?
命令替换在子shell中运行。当子shell退出时,其状态的结果将填充PIPESTATUS
,覆盖子shell中的内容。
我该如何解决?
检查子壳内的PIPESTATUS。
$(grep g09 $INPUT | cut -f2 -d' '; [[ 1 == $PIPESTATUS[0] ]] && { ... })
答案 1 :(得分:2)
对于您的情况,您只需检查通过cut
提取的值是否为空。
if [[ -z $GF ]]; then