tutorial traduccion script comandos bash

traduccion - bash ubuntu



Usar unset vs. establecer una variable para vaciar (3)

Actualmente estoy escribiendo un marco de prueba de bash, donde en una función de prueba, se pueden usar tanto las pruebas estándar de bash ( [[ ) como las de predefinidos. Los participantes son envoltorios para ''[['' y además de devolver un código de retorno, establezca un mensaje significativo que diga lo que se esperaba.

Ejemplo:

string_equals() { if [[ ! $1 = $2 ]]; then error_message="Expected ''$1'' to be ''$2''." return 1 fi }

Por lo tanto, cuando se utiliza un matcher y falla, solo se establece un error_message.

Ahora, en algún momento más adelante, pruebo si las pruebas tuvieron éxito. Si tuvo éxito, imprimí la expectativa en verde, si falló en rojo.

Además, puede haber un conjunto error_message, así que pruebo si existe un mensaje, lo imprimo y luego lo desarmo (porque la siguiente prueba puede no establecer un error_message ):

if [[ $error_message ]]; then printf ''%s/n'' "$error_message" unset -v error_message fi

Ahora mi pregunta es, si es mejor desarmar la variable, o simplemente establecerla en '''', como

error_message=''''

¿Cuál es mejor? ¿Realmente hace la diferencia? O tal vez debería tener una bandera adicional que indique que el mensaje fue configurado?


Como se ha dicho, el uso de unset es diferente con las matrices también

$ foo=(4 5 6) $ foo[2]= $ echo ${#foo[*]} 3 $ unset foo[2] $ echo ${#foo[*]} 2


En su mayoría, no ve la diferencia, a menos que esté utilizando el set -u :

/home/user1> var="" /home/user1> echo $var /home/user1> set -u /home/user1> echo $var /home/user1> unset var /home/user1> echo $var -bash: var: unbound variable

Entonces, realmente, depende de cómo va a probar la variable.

Añadiré que mi forma de prueba preferida si está configurada es:

[[ -n $var ]] # True if the length of $var is non-zero

o

[[ -z $var ]] # True if zero length


Por lo tanto, al deshacer el índice 2 de la matriz, esencialmente elimina ese elemento en la matriz y disminuye el tamaño de la matriz (?).

Hice mi propia prueba ...

foo=(5 6 8) echo ${#foo[*]} unset foo echo ${#foo[*]}

Lo que resulta en..

3 0

Así que solo para aclarar que deshacer la matriz completa de hecho lo eliminará por completo.