
我有以下簡單的腳本。在此腳本中,我為函數內的全域變數賦值。我可以清楚地看到該值是透過調試語句分配給變數的。但是,當我最後回顯該變數時,它始終為空。
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()
函數中。確實有這個功能做分配一個值,但該值僅在您設定它的子 shell$RECYCLEBIN
的持續時間內持續存在。它會$(
)
不是將任何變更套用至其父 shell 的環境 - 這是您呼叫它的地方。當你:
eval echo "Recyclebin: ${RECYCLEBIN}"
eval
將其所有參數解析為空格分隔的字串,並嘗試將結果作為 shell 命令運行。所以"${RECYCLEBIN}"
消失了,因為 - 在當前的 shell 環境中 - 它最後被設定為''
空字串,例如:
RECYCLEBIN=
因此,在執行該語句時,它所做的就是:
echo Recyclebin:
這在功能上與...沒有什麼不同
echo "Recyclebin: ${RECYCLEBIN}"
……無論如何,因為$RECYCLEBIN
是空的。