Co robi unset?

Próbuję zrozumieć następującą część dotyczącą unset z https://unix.stackexchange.com/a/381782/674

unset in bash 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 zmienna unset jest nie tylko nieustawiona, ale także niezadeklarowana?

    Jeśli unset zmienną o zasięgu globalnym, czy zmienna unset 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:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *