请解释为什么最后一个"回声"声明是空白的?我希望它在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语句之外打印.我想我在这里缺少一些关于变量范围的东西,但是ol'手册页并没有显示给我.
因为您正在使用while循环,所以会创建一个子shell来运行while循环.现在这个子进程拥有它自己的环境副本,并且无法将任何变量传递回其父进程(如在任何unix进程中).
因此,您需要进行重组,以便不会进入循环.或者,您可以在函数中运行,例如,并回显您希望从子流程返回的值.
http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
问题是与管道放在一起的流程在子壳中执行(因此具有自己的环境).无论发生什么while
都不会影响管道外的任何东西.
您可以通过重写管道来解决您的具体示例
while ... do ... done <<< "$OUTPUT"
也许
while ... do ... done < <(echo "$OUTPUT")
这应该也可以(因为echo和while在同一个子shell中):
#!/bin/bash cat /tmp/randomFile | (while read line do LINE="$LINE $line" done && echo $LINE )