当前位置:  开发笔记 > 编程语言 > 正文

Bash变量范围

如何解决《Bash变量范围》经验,为你挑选了3个好方法。

请解释为什么最后一个"回声"声明是空白的?我希望它在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'手册页并没有显示给我.



1> pixelbeat..:

因为您正在使用while循环,所以会创建一个子shell来运行while循环.现在这个子进程拥有它自己的环境副本,并且无法将任何变量传递回其父进程(如在任何unix进程中).

因此,您需要进行重组,以便不会进入循环.或者,您可以在函数中运行,例如,并回显您希望从子流程返回的值.

http://tldp.org/LDP/abs/html/subshel​​ls.html#SUBSHELL



2> mweerden..:

问题是与管道放在一起的流程在子壳中执行(因此具有自己的环境).无论发生什么while都不会影响管道外的任何东西.

您可以通过重写管道来解决您的具体示例

while ... do ... done <<< "$OUTPUT"

也许

while ... do ... done < <(echo "$OUTPUT")


对于那些正在考虑整个<()语法是什么的人(就像我一样),它被称为"过程替换",上面详述的具体用法可以在这里看到:http://mywiki.wooledge .ORG/ProcessSubstitution
每个人都应该定期使用过程替换!这是超级有用的。我每天都做类似`vimdiff <(grep WARN log.1 | sort | uniq)<(grep WARN log.2 | sort | uniq)`的事情。考虑到您可以一次使用多个文件,并将它们像文件一样对待...可能性!

3> 小智..:

这应该也可以(因为echo和while在同一个子shell中):

#!/bin/bash
cat /tmp/randomFile | (while read line
do
    LINE="$LINE $line"
done && echo $LINE )

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有