Der innerhalb einer Funktionsvariablen zugewiesene Wert ist immer leer

Der innerhalb einer Funktionsvariablen zugewiesene Wert ist immer leer

Ich habe das folgende einfache Skript. In diesem Skript weise ich einer globalen Variable innerhalb einer Funktion einen Wert zu. Ich kann deutlich erkennen, dass der Wert der Variablen über eine Debug-Anweisung zugewiesen wird. Wenn ich die Variable jedoch am Ende wiedergebe, ist sie immer leer.

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**

Sieht irgendjemand, was hier schief läuft??

Antwort1

Sie erwarten:

CONFIG_RESULT=$(configuer)

Um einen Wert zuzuweisen, $RECYCLEBINweil Sie...

RECYCLEBIN="$value"

... in der configuer()Funktion. Es stimmt, dass die Funktiontuteinen Wert zuweisen $RECYCLEBIN, aber dieser Wert bleibt nur für die Dauer der $(Subshell bestehen ), in der Sie ihn festlegen. Es wirdnichtWenden Sie alle Änderungen auf die Umgebung der übergeordneten Shell an, also dort, wo Sie sie aufrufen. Wenn Sie:

eval echo "Recyclebin: ${RECYCLEBIN}"

evalanalysiert alle seine Argumente in eine durch Leerzeichen getrennte Zeichenfolge und versucht, die Ergebnisse als Shell-Befehl auszuführen. Verschwindet also, weil es - in der aktuellen Shell-Umgebung - zuletzt auf die Nullzeichenfolge "${RECYCLEBIN}"gesetzt wurde, wie:''

RECYCLEBIN=

Bei der Ausführung der Anweisung geschieht also lediglich Folgendes:

echo Recyclebin:

Was funktional nicht anders ist als ...

echo "Recyclebin: ${RECYCLEBIN}"

...jedenfalls, weil $RECYCLEBINes leer ist.

verwandte Informationen