¿Qué hace unset?

Estoy tratando de comprender la siguiente parte sobre unset de https://unix.stackexchange.com/a/381782/674

unset en bash solo desarma una variable si ha sido declarada en el alcance actual ( lo deja declarado aunque excepto en el ámbito global ; elimina atributos y valores y la variable ya no es matriz o hash; tenga en cuenta que en namerefs, desarma la variable referenciada). De lo contrario, solo aparece una capa variable de la pila mencionada anteriormente.

El manual de Bash no menciona nada relacionado, o lo extraño.

¿Podría explicar con ejemplos para

  • «solo desarma una variable se ha declarado en el alcance actual «
  • » lo deja declarado, excepto en el alcance global «.

    Si unset una variable que está en el alcance local de una función, ¿la variable unset no solo no está definida sino también no declarada?

    Si unset una variable que está en el alcance global, ¿la unset variable está desarmada pero aún declarada?

    ¿Cómo puedo verificar si una variable está ¿declarado o no?

  • «De lo contrario, solo saca una capa variable de la pila mencionada anteriormente».

    ¿Qué significan «de lo contrario» y «una capa variable»?

Gracias.

Responder

Mejor con ejemplos:

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

Eso «s unset llamado en una variable declarada en el mismo ámbito. Está correctamente desarmado. Todavía está declarado (aunque ha perdido atributos y valor), todavía está limitado a ese ámbito. Verá que aunque hacemos un a=2, todavía se hace en un a local a f, el del ámbito externo no se ve afectado. Eso es bueno y lo que queremos.

En:

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

Puede ver que unset a no desarmó a. En cambio, reveló el que está debajo, el del alcance externo. Cuando g regrese, la variable f «s a ya no será local.

En bash 5+, eso se puede solucionar configurando la opción localvar_unset.

Tenga en cuenta que es aún peor en mksh y yash donde unset hace que estalle en lugar de desarmar incluso para variables que se han declarado en el mismo ámbito. El primer ejemplo con ellos da:

typeset a=0 2 

Más información en:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *