1. ホーム
  2. bash

[解決済み] Bashの変数スコープ

2022-03-05 17:22:02

質問

なぜ最後の echo の文が空白になっていませんか?私は XCODE は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文の外にはプリントされません。変数のスコープについて何か見逃しているような気がするのですが、オールド・マニュアル・ページには表示されていません。

解決するには?

whileループに配管しているため、サブシェルが作成され、whileループが実行されます。

この子プロセスは自分自身の環境のコピーを持っており、どのような 変数を親に返します(他のUNIXプロセスと同様)。

したがって、ループにパイプを通さないように再構築する必要があります。 別の方法として、例えば関数で実行して echo を指定します。 サブプロセスから返されたい。

http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL