Bash变量范围
时间:2020-03-06 14:37:49 来源:igfitidea点击:
请向我解释为什么最后一个" echo"语句为空?我希望它在while循环中增加到1:
#!/bin/bash OUTPUT="name1 ip ip status" # normally output of another command with multi line output if [ -z "$OUTPUT" ] then echo "Status WARN: No messages from SMcli" exit $STATE_WARNING else echo "$OUTPUT"|while read NAME IP1 IP2 STATUS do if [ "$STATUS" != "Optimal" ] then echo "CRIT: $NAME - $STATUS" echo $((++XCODE)) else echo "OK: $NAME - $STATUS" fi done fi echo $XCODE
我尝试使用以下语句代替++ XCODE方法
XCODE=`expr $XCODE + 1`
而且它也不会在while语句之外打印。我想我在这里缺少有关变量范围的信息,但是联机帮助页并未向我显示。
解决方案
#!/bin/bash OUTPUT="name1 ip ip status" +export XCODE=0; if [ -z "$OUTPUT" ] ---- echo "CRIT: $NAME - $STATUS" - echo $((++XCODE)) + export XCODE=$(( $XCODE + 1 )) else echo $XCODE
看看这些改变是否有帮助
因为我们正在管道进入while循环,所以将创建一个子shell来运行while循环。
现在,此子进程具有其自己的环境副本,无法传递任何
变量返回其父级(与任何Unix进程一样)。
因此,我们将需要进行重组,以免流到循环中。
另外,我们可以运行一个函数,例如,回显值
想要从子流程中返回。
http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
问题在于,与管道放在一起的进程是在子外壳程序中执行的(因此具有自己的环境)。在while期间发生的任何事情都不会影响管道外部的任何内容。
具体示例可以通过将管道重写为
while ... do ... done <<< "$OUTPUT"
也许
while ... do ... done < <(echo "$OUTPUT")