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/subshel​​ls.html#SUBSHELL

问题在于,与管道放在一起的进程是在子外壳程序中执行的(因此具有自己的环境)。在while期间发生的任何事情都不会影响管道外部的任何内容。

具体示例可以通过将管道重写为

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

也许

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