Vad gör unset?

Jag försöker förstå följande del om unset från https://unix.stackexchange.com/a/381782/674

unset i bash stänger bara av en variabel om den har deklarerats i det aktuella omfånget ( lämnar det deklarerat men utom i det globala omfånget ; det tar bort attribut och värden och variabeln är inte längre array eller hash; också Observera att på namerefs avaktiveras den refererade variabeln). Annars dyker det bara upp ett variabelt lager från stapeln som nämns ovan.

Bash-manualen nämner inte något relaterat, eller jag saknar det.

Kan du förklara med exempel för

  • ”stänger bara av en variabel om det har förklarats i det nuvarande omfånget ”
  • ” lämnar det deklarerat men utom i det globala omfånget ”.

    Om unset en variabel som finns i funktionens lokala omfång, är unset variabeln inte bara avstängd utan också odeklarerad?

    Om unset en variabel som är i det globala omfånget, är unset variabeln bara avstängd men ändå deklarerad?

    Hur kan jag kontrollera om en variabel är deklareras eller inte?

  • ”Annars dyker det bara upp ett variabelt lager från stapeln som nämns ovan.”

    Vad betyder ”annars” och ”ett variabelt lager”?

Tack.

Svar

Bäst med exempel:

$ bash -c "a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"" declare -- a 0 

Att ”s unset anropade en variabel som deklareras i samma omfattning. Den är ordentligt avstängd. Det är fortfarande deklarerat (även om det har tappat attribut och värde), är det fortfarande begränsat till det omfattningen. Du ser att även om vi gör en a=2 så görs det fortfarande på en a lokal till f påverkas inte den från det yttre omfånget. Det är bra och vad vi vill ha.

I:

$ ./bash -c "a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"" 0 2 

Du kan se att unset a avmarkerade inte a. Istället avslöjade den en under, den från det yttre omfånget. När g återvänder kommer f ”s a inte längre att vara lokal.

I bash 5+ kan det åtgärdas genom att ställa in alternativet localvar_unset.

Observera att det är ännu värre i mksh och yash där unset gör det poppar istället för avstängning även för variabler som har deklarerats i samma omfattning. Det första exemplet med dem ger:

typeset a=0 2 

Ytterligare läsning på:

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *