En bash, si hago una tarea
a=
¿Qué es a
ahora? Estoy seguro de que a no es ''
una cadena y no 0
.
Solo encontré la siguiente prueba que es verdadera.
if [ $a = ];then echo 'good';fi
Respuesta1
Es la cadena vacía.
Es lo mismo que hacer:
a=''
O
a=""
O
a=$''
O para eso importa:
a=''""$''
Esos ''
, ""
y $'...'
están citando operadores en el shell. Cuando tu lo hagas:
a=''
No está asignando una cadena formada por dos comillas simples, sino $a
la cadena vacía. Son ''
superfluos ya que no hay nada dentro de ellos, pero eso puede hacer que su código sea un poco más legible (deje más claro que tenía la intención de asignar una cadena vacía).
Para asignar un literal ''
a $a
, deberás citar esos caracteres especiales como:
a="''" a=\'\' a=$'\'\'' a="'"\'
Su comando de prueba no es válido. En
[ $a = ]
Como olvidó citar $a
, se aplica el operador split+glob a $a
. Dado que $a
está vacío (pero sería lo mismo si solo contuviera espacios en blanco o líneas nuevas con el valor predeterminado de $IFS
), eso da como resultado que no se pase ningún argumento al [
comando.
Entonces todos los argumentos [
que recibe son [
, =
y ]
. Para [
, esa es una prueba para saber si =
es una cadena que no está vacía y devuelve verdadero.
Lo que quieres aquí es pasar estos argumentos al [
comando:
[
- el contenido del
$a
cual necesitas"$a"
=
- la cadena vacía. Para lo que necesita
''
o""
... No pasar nada significaría que no se pasa ningún argumento,[
por lo que el cuarto argumento sería el cierre]
. ]
Entonces debería ser:
if [ "$a" = '' ]; then echo '$a is empty'; fi
O:
if [ -z "$a" ]; then echo '$a is empty'; fi
Respuesta2
La variable a es igual a una cadena vacía.
a=
if [ "$a" -eq "" ]; then echo 'good'; fi
La salida es:
$ . tst.sh
good
Y para este código:
a=
if [ -z "$a" ]; then echo 'good'; fi
La salida es la misma.