2017-05-13 36 views
1

更改变量我正在写入的警告到标准输出的命令,我想我的脚本停止对这些警告,因此拼凑了很多东西,我在这里学到的,我有以下。 ..在shell脚本循环

warnd=false; 
    myLongCommand | 
    while IFS= read -r line 
    do 
     if [[ $line == *"WARNING in ."* ]]; then 
      warnd=true; 
      echo "found a warning!!!!!" 
      break 
     fi 
     echo $line 
    done 
    echo WARNING IS $warnd 
    if [[ "$warnd" == true ]]; then 
     echo "exiting due to warning" 
     exit 
    else 
     echo "no warnings" 
    fi 

但是,这并不如我所料。当myLongCommand写入警告时,我看到以下回显:...

发现警告!!!!!

警告是假的

没有警告

为什么不是改变我在循环后看到warnd变量。我读过有关shell脚本变量的作用域,但似乎没有任何表明该循环内的变量具有不同的范围。

+1

变化'myLongCommand |对于;请; done'到'对;待办事项;完成<<(mylongcommand)'。管道打开一个子shell,并且当它完成关闭它,导致子shell设置任何变量丢失。 – 123

回答

1

您正在管道中运行该命令并修改一个变量,不是在由管道线创建的子shell终止后生效。使用合适的工艺替代技术与while循环,

while IFS= read -r line 
do 
    if [[ $line == *"WARNING in ."* ]]; then 
     warnd=true; 
     echo "found a warning!!!!!" 
     break 
    fi 
done< <(myLongCommand) 

值得一读这BashFAQ - 024 - I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?

一个简单的例子,从链接的页面引用,

linecount=0 

printf '%s\n' foo bar | 
while IFS= read -r line 
do 
    linecount=$((linecount + 1)) 
done 

echo "total number of lines: $linecount" 

所以理想的预期值所述lineCount2但是由于变量是在由管道线产生的子壳更新时,更新不一旦子shell退出反映。

仅供参考,上述小片段产生一个输出作为

total number of lines: 0 
+0

谢谢。这个解决方案对我不起作用,但它让我走上了正轨。 (DUP也没有帮助我)。我在那条完成的行上出现了意外令牌附近的语法错误'<''。我固定的方式是用花括号将所有命令都包裹在命令后面。感谢您让我走上正轨! – user1272965

+0

@ user1272965:快乐是帮助。你没有让我们知道你的命令,否则我们可以发现它是否有任何问题。但是我的回答是在更新变量时避免管道的一般方法。 – Inian