Próbuję zrozumieć następującą część dotyczącą unset z https://unix.stackexchange.com/a/381782/674
unsetinbashkasuje 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
unsetzmienna, która jest w lokalnym zasięgu funkcji, czy zmiennaunsetjest nie tylko nieustawiona, ale także niezadeklarowana?Jeśli
unsetzmienną o zasięgu globalnym, czy zmiennaunsetjest 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: