
Eu tenho o seguinte script simples. Neste script, estou atribuindo um valor a uma variável global dentro de uma função. Posso ver claramente que o valor está sendo atribuído à variável por meio de uma instrução de depuração. Porém, quando faço eco da variável no final, ela fica sempre vazia.
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**
Alguém vê o que está acontecendo de errado aqui?
Responder1
Você está esperando:
CONFIG_RESULT=$(configuer)
Para atribuir um valor a $RECYCLEBIN
porque você...
RECYCLEBIN="$value"
... na configuer()
função. É verdade que a funçãofazatribua um valor a $RECYCLEBIN
, mas esse valor persiste apenas durante o $(
subshell)
em que você o definiu. Ele vainãoaplique quaisquer alterações ao ambiente do shell pai - que é onde você o chama. Quando você:
eval echo "Recyclebin: ${RECYCLEBIN}"
eval
analisa todos os seus argumentos em uma string separada por espaço e tenta executar os resultados como um comando shell. Então "${RECYCLEBIN}"
desaparece porque - no ambiente shell atual - foi definido pela última vez como a ''
string nula como:
RECYCLEBIN=
Então, na execução da instrução, tudo o que faz é:
echo Recyclebin:
O que funcionalmente não é diferente de...
echo "Recyclebin: ${RECYCLEBIN}"
...de qualquer forma porque $RECYCLEBIN
está vazio.