我正在运行一个将警告写入标准输出的命令,并且我希望我的脚本停止这些警告,因此将我在这里学到的很多东西拼凑起来,我有以下内容......
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 脚本变量范围的文章,但似乎没有任何内容表明循环内的变量具有不同的范围。
您正在管道中运行命令并修改变量,该变量在管道创建的子外壳终止后不会生效。使用适当的过程替换技术和 while 循环,
while IFS= read -r line
do
if [[ $line == *"WARNING in ."* ]]; then
warnd=true;
echo "found a warning!!!!!"
break
fi
done< <(myLongCommand)
值得阅读此BashFAQ - 024 - 我在管道中的循环中设置变量。为什么它们在循环终止后消失?或者,为什么我不能通过管道读取数据?
从链接页面引用的一个简单示例,
linecount=0
printf '%s\n' foo bar |
while IFS= read -r line
do
linecount=$((linecount + 1))
done
echo "total number of lines: $linecount"
所以理想情况下, 的预期值lineCount
将是,2
但由于变量在管道创建的子外壳中更新,一旦子外壳退出,更新就不会反映。
仅供参考,上面的小片段产生的输出为
total number of lines: 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句