Próbuję zrozumieć następującą część dotyczącą unset
z https://unix.stackexchange.com/a/381782/674
unset
inbash
kasuje zmienną tylko wtedy, gdy została zadeklarowana w bieżącym zakresie ( pozostawia to zadeklarowane z wyjątkiem zakresu globalnego ; usuwa atrybuty i wartości, a zmienna nie jest już tablicą ani hashem; także zwróć uwagę, że w przypadku nazw odwołań usuwa odwołanie do zmiennej). W przeciwnym razie po prostu zdejmuje jedną zmienną warstwę ze stosu wspomnianego powyżej.
Instrukcja Bash nie wspomina o niczym związanym lub tęsknię za tym.
Czy mógłbyś wyjaśnić na przykładach dla
- „kasuje zmienną tylko wtedy, gdy został zadeklarowany w bieżącym zakresie „
-
” pozostawia go jednak zadeklarowanym z wyjątkiem zakresu globalnego ”.
Jeśli
unset
zmienna, która jest w lokalnym zasięgu funkcji, czy zmiennaunset
jest nie tylko nieustawiona, ale także niezadeklarowana?Jeśli
unset
zmienną o zasięgu globalnym, czy zmiennaunset
jest tylko nieustawiona, ale nadal zadeklarowana?Jak mogę sprawdzić, czy zmienna jest zadeklarowane czy nie?
-
„W przeciwnym razie po prostu zdejmuje jedną zmienną warstwę ze stosu wspomnianego powyżej”.
Co oznaczają „inaczej” i „jedna zmienna warstwa”?
Dzięki.
Odpowiedź
Najlepiej z przykładami:
$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0
To „s unset
wywołało zmienną zadeklarowaną w tym samym zakresie. Jest ona poprawnie ustawiona. Nadal jest zadeklarowany (chociaż stracił atrybuty i wartość), nadal jest ograniczony do tego zakresu. Widzisz, że mimo że wykonujemy a=2
, nadal jest to wykonywane na a
lokalnym dla f
, ten z zewnętrznego zakresu nie ma wpływu. To dobrze i czego chcemy.
W:
$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2
Możesz zobaczyć, że unset a
didn „t unset unset a
. Zamiast tego ujawnił ten pod spodem, ten z zewnętrznego zakresu. Kiedy g
zwraca, zmienna f
„s a
nie będzie już lokalna.
W bash 5+ można to naprawić, ustawiając opcję localvar_unset
.
Zauważ, że jest jeszcze gorzej w mksh
i yash
, gdzie unset
robi to wyskakujące zamiast rozbrajające nawet dla zmiennych, które zostały zadeklarowane w tym samym zakresie. Pierwszy przykład z nimi daje:
typeset a=0 2
Więcej informacji pod adresem: