Actualmente estoy escribiendo un marco de prueba de bash, donde en una función de prueba, [[
se pueden usar tanto las pruebas de bash estándar ( ) como los matchers predefinidos. Los comparadores son envoltorios de '[[' y, además de devolver un código de retorno, establecen 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
}
Entonces, cuando se usa un comparador y falla, solo entonces se establece un error_message.
Ahora, en algún momento después, pruebo si las pruebas tuvieron éxito. Si tuvo éxito, imprimo la expectativa en verde, si falló en rojo.
Además, puede haber un error_message configurado, 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 alguna diferencia? ¿O tal vez debería tener una bandera adicional que indique que el mensaje se estableció?
error_message
con nada más, diría que no importa. Sin embargo, creo que lo desea[[ $error_message ]]
, de lo contrario, está probando que existe la cadena literal "mensaje_error".Respuestas:
En general, no ve una diferencia, a menos que esté usando
set -u
:Entonces, realmente, depende de cómo vas a probar la variable.
Agregaré que mi forma preferida de probar si está configurada es:
o
fuente
var=
no está "no configurado". Es solo una cadena vacía sin comillas. Ademásset -u
, las diversas formas de expansión de parámetros de bash también pueden distinguir entre valores nulos y no definidos: se${foo:bar}
expande a "bar" cuando nofoo
está configurado, pero "" cuandofoo
es nulo, mientras que se${foo:-bar}
expande a "bar" si foo no está configurado o es nulo.[[ -n $var ]]
es falso sivar
se establece en la cadena vacía.${foo-bar}
lugar de${foo:bar}
. prueba por ti mismo:unset a; echo ">${a:-foo}-${a:foo}-${a-foo}<"
Como se ha dicho, el uso de unset también es diferente con las matrices
fuente
Entonces, al desarmar 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 ..
Lo que resulta en..
Entonces, solo para aclarar que desarmar toda la matriz, de hecho, la eliminará por completo.
fuente
Basado en los comentarios anteriores, aquí hay una prueba simple:
Ejemplo:
fuente