
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, $RECYCLEBIN
weil 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}"
eval
analysiert 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 $RECYCLEBIN
es leer ist.