Condición de prueba en el comando if

Condición de prueba en el comando if

¿Alguna idea de por qué echose ejecuta la declaración en ambos escenarios?

Salidas it worked:

#!/bin/bash

rizwan=''
if [ -n $rizwan ]; then
  echo "it worked"
fi

Reemplácelo -ncon -zy generará it workedcuando 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 ifsintaxis. Me refiero if [ …a que se comporta como if true, if falseo , if any_commanddonde [, y son comandos. Devuelven el estado de salida y esto es lo que les importa .truefalseany_commandif

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 testes equivalente a [. La única diferencia es testque no requiere ].
[ -n whatever ]es equivalente a test -n whatever.

Si el shell se expande $rizwana 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 STRINGes -no -z. Esta sintaxis prueba si STRINGno está vacío. Sus pruebas siempre tienen éxito porque ni -nni -zes 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 $rizwanen 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 rizwanestá vacía, su ifcomando 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 -nevidentemente no está vacía.

información relacionada