
У меня есть следующий простой скрипт. В этом скрипте я присваиваю значение глобальной переменной внутри функции. Я ясно вижу, что значение присваивается переменной через оператор отладки. Однако, когда я вывожу переменную в конце, она всегда пуста.
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
он пуст.