¿Alguna idea de por qué echo
se ejecuta la declaración en ambos escenarios?
Salidas it worked
:
#!/bin/bash
rizwan=''
if [ -n $rizwan ]; then
echo "it worked"
fi
Reemplácelo -n
con -z
y generará it worked
cuando no se espera ningún resultado:
#!/bin/bash
rizwan=''
if [ -z $rizwan ]; then
echo "it worked"
fi
Respuesta1
Puede que lo sepas o no, pero dejémoslo claro: [
no forma parte de la if
sintaxis. Me refiero if [ …
a que se comporta como if true
, if false
o , if any_command
donde [
, y son comandos. Devuelven el estado de salida y esto es lo que les importa .true
false
any_command
if
Incluso si [
es un comando integrado (y está en Bash), se comporta como un comando normal. Incluso hay un [
ejecutable independiente (p. ej. /usr/bin/[
) porque POSIX lo requiere.
Esto significa [ -n whatever ]
que es sólo un [
comando con pocos argumentos. Sí, ]
es solo un argumento, no es un delimitador ni nada por el estilo. El comando nombrado [
solo requiere ]
ser su último argumento. De esta manera el código es más legible y ]
no sirve para ningún otro propósito.
El comando test
es equivalente a [
. La única diferencia es test
que no requiere ]
.
[ -n whatever ]
es equivalente a test -n whatever
.
Si el shell se expande $rizwan
a una cadena vacía, los fragmentos [ -n $rizwan ]
y [ -z $rizwan ]
se convierten [ -n ]
en y [ -z ]
respectivamente. El [
comando no sabe que había algo entre -n
(o -z
) y ]
en su código obtiene exactamente dos argumentos. Ambas pruebas se tratan como la [ STRING ]
sintaxis donde STRING
es -n
o -z
. Esta sintaxis prueba si STRING
no está vacío. Sus pruebas siempre tienen éxito porque ni -n
ni -z
es una cadena vacía.
Para que los fragmentos funcionen como [ -n STRING ]
o [ -z STRING ]
, debe colocar la variable entre comillas dobles. El caparazón, después de expandirse [ -z "$rizwan" ]
, pasará exactamentetresargumentos para [
. Serán -z
, el valor expandido de la variable (incluso si es una cadena vacía) y ]
. La herramienta obtendrá todos los argumentos que deseaba.
Si no está entrecomillado $rizwan
en sus ejemplos se expande a más de una palabra, [
obtendría más de tres argumentos. En general el resultado final dependería del contenido de la variable y de la implementación de [
.
Comparar¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?.
La nota [[
en Bash es diferente. Es una palabra clave, está integrada con el analizador de shell, cambia algunas reglas, en realidad tiene en cuenta las variables y las comillas entre [[
y ]]
. Si usó [[
en lugar de [
(y, en consecuencia, ]]
en lugar de ]
), entonces su código funcionará como esperaba. Veresta respuesta.
[
es el portátil.
Respuesta2
Como la variable rizwan
está vacía, su if
comando se convierte en:
if [ -n ]
La sintaxis [ STRING ]
prueba si la cadena está vacía (sin caracteres). Entonces, en su caso de [ -n ]
, la cadena -n
evidentemente no está vacía.