関数変数の内部に割り当てられた値は常に空です。

関数変数の内部に割り当てられた値は常に空です。

次の簡単なスクリプトがあります。このスクリプトは、関数内のグローバル変数に値を割り当てます。デバッグステートメントを使用すると、変数に値が割り当てられていることを確認できます。しかし、最終的に変数をエコーすると常に空になります。

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空いていますから。

おすすめ記事