Значение, присвоенное внутри функциональной переменной, всегда пустое.

Значение, присвоенное внутри функциональной переменной, всегда пустое.

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

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он пуст.

Связанный контент