次の簡単なスクリプトがあります。このスクリプトは、関数内のグローバル変数に値を割り当てます。デバッグステートメントを使用すると、変数に値が割り当てられていることを確認できます。しかし、最終的に変数をエコーすると常に空になります。
function getValue()
{
local key=$1
local configFile=$2
keyValuePair="$(egrep "$key" "$configFile")"
if [ ! "$?" -eq 0 ]
then
echo "Cannot find the value for the specifed key"
return 1;
fi
value="$(cut -d"=" -f"2" <<< "$keyValuePair")"
echo "$value"
return 0;
}
function configuer()
{
if [ ! -f "$RMCFGFILE" ]
then
echo "Cannot file RMGCFG file."
return 1;
fi
#Recyclebin configuration
value=$(getValue "recyclebin" $RMCFGFILE)
if [ ! "$?" -eq 0 ]
then
echo "$value"
return 1;
fi
RECYCLEBIN="$value" **#### I am assigning here**
return 0;
}
RECYCLEBIN=
RMCFGFILE="/home/sas/.rm.cfg"
LOCALEFILE=""
CONFIG_RESULT=$(configuer)
if [ ! "$?" -eq 0 ]
then
echo "$CONFIG_RESULT"
exit 1;
fi
echo "Configuration success"
eval echo "Recyclebin: ${RECYCLEBIN}" **##No value**
ここで何が起こっているのか知っている人はいますか?
答え1
あなたが期待するものは:
CONFIG_RESULT=$(configuer)
値を割り当てる$RECYCLEBIN
理由は次のとおりです。
RECYCLEBIN="$value"
...configuer()
関数です。このような機能がありますねする値を割り当てますが、その値は、その値を設定したサブシェルが持続して$RECYCLEBIN
いる間のみ保持されます。そうだろう$(
)
いいえ親シェルの環境に変更を適用します。ここで呼び出します。時:
eval echo "Recyclebin: ${RECYCLEBIN}"
eval
すべての引数をスペースで区切られた文字列に解析し、結果をシェルコマンドとして実行しようとします。したがって、現在のシェル環境では空の文字列"${RECYCLEBIN}"
に設定されているため消えます。たとえば、次のようになります。''
RECYCLEBIN=
したがって、このステートメントの実行時に実行されるアクションは次のとおりです。
echo Recyclebin:
これは機能的には以下と変わらない。
echo "Recyclebin: ${RECYCLEBIN}"
…とにかく$RECYCLEBIN
空いていますから。