我有以下简单的脚本。在此脚本中,我为函数内的全局变量赋值。我可以清楚地看到该值是通过调试语句分配给变量的。但是,当我最后回显该变量时,它始终为空。
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
是空的。