¿Cómo puedo verificar si una variable está vacía en Bash?
¿Cómo puedo verificar si una variable está vacía en Bash?
Respuestas:
En Bash, al menos el siguiente comando prueba si $ var está vacío :
if [[ -z "$var" ]]; then
# Do what you want
fi
El comando man test
es tu amigo.
./test.ksh[8]: test: argument expected
cuál es la razón, pero el corchete simple no funcionó, pero el doble lo tenía.
if test -z "$var"
, ¿verdad?
set -u
opción ha sido activada, esta prueba fallará unbound variable
. En este caso, es posible que prefiera la solución de @ alexli.
Presumiendo Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
está más cerca de lo que se le preguntó. Jay ha puesto esto en su respuesta, así que me abstendré de actualizar la mía y dejaré esto como está.
Yo tambien he visto
if [ "x$variable" = "x" ]; then ...
que obviamente es muy robusto e independiente de la carcasa.
Además, hay una diferencia entre "vacío" y "no establecido". Vea Cómo saber si una cadena no está definida en un script de shell Bash .
$variable
está vacío, entonces la cadena a la izquierda del operador de comparación se vuelve única x
, que es igual a la cadena a la derecha del operador. [ x = x ]
es "verdadero", por lo que en la práctica esto prueba si $variable
está vacío o no. Como una adición (3½ años después del hecho :-)) Nunca usaría esto yo mismo, ya que -z
hace lo que probablemente quiero de una manera más clara, pero quería agregar esta respuesta ya que este método se ve con frecuencia "en la naturaleza"; quizás escrito de esta manera a propósito por personas que han tenido experiencias diferentes a las mías.
if [ ${foo:+1} ]
then
echo "yes"
fi
imprime yes
si la variable está configurada. ${foo:+1}
devolverá 1 cuando se establezca la variable; de lo contrario, devolverá una cadena vacía.
set -u
opción ( nounset
) está activada. Casi todas las otras respuestas a esta pregunta fallarán unbound variable
en este caso.
:+
notación también es útil para situaciones en las que tiene parámetros opcionales de línea de comandos que ha especificado con variables opcionales. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Esto devolverá true
si una variable no está establecida o establecida en la cadena vacía ("").
if [ -z "$MyVar" ]
then
echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
echo "The variable MyVar has something in it."
fi
elif !
lugar de else
?
! [ -z "$MyVar" ]
significaría que la variable podría tener algo en ella. Pero idealmente uno lo usaría else
.
La pregunta pregunta cómo verificar si una variable es una cadena vacía y las mejores respuestas ya están dadas para eso.
Pero llegué aquí después de un período de programación en PHP, y en realidad estaba buscando una verificación como la función vacía en PHP trabajando en un shell Bash.
Después de leer las respuestas, me di cuenta de que no estaba pensando correctamente en Bash, pero de todos modos en ese momento una función como vacío en PHP habría sido muy útil en mi código de Bash.
Como creo que esto puede sucederle a otros, decidí convertir la función vacía de PHP en Bash.
De acuerdo con el manual de PHP :
una variable se considera vacía si no existe o si su valor es uno de los siguientes:
Por supuesto, los casos nulo y falso no se pueden convertir en bash, por lo que se omiten.
function empty
{
local var="$1"
# Return true if:
# 1. var is a null string ("" as empty string)
# 2. a non set variable is passed
# 3. a declared variable or array but without a value is passed
# 4. an empty array is passed
if test -z "$var"
then
[[ $( echo "1" ) ]]
return
# Return true if var is zero (0 as an integer or "0" as a string)
elif [ "$var" == 0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
# Return true if var is 0.0 (0 as a float)
elif [ "$var" == 0.0 2> /dev/null ]
then
[[ $( echo "1" ) ]]
return
fi
[[ $( echo "" ) ]]
}
Ejemplo de uso:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
Demostración:
el siguiente fragmento:
#!/bin/bash
vars=(
""
0
0.0
"0"
1
"string"
" "
)
for (( i=0; i<${#vars[@]}; i++ ))
do
var="${vars[$i]}"
if empty "${var}"
then
what="empty"
else
what="not empty"
fi
echo "VAR \"$var\" is $what"
done
exit
salidas:
VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty
Una vez dicho esto, en una lógica Bash, las comprobaciones de cero en esta función pueden causar problemas secundarios, cualquiera que use esta función debería evaluar este riesgo y tal vez decidir cortar esas comprobaciones dejando solo el primero.
Es posible que desee distinguir entre las variables no definidas y las variables establecidas y vacías:
is_empty() {
local var_name="$1"
local var_value="${!var_name}"
if [[ -v "$var_name" ]]; then
if [[ -n "$var_value" ]]; then
echo "set and non-empty"
else
echo "set and empty"
fi
else
echo "unset"
fi
}
str="foo"
empty=""
is_empty str
is_empty empty
is_empty none
Resultado:
set and non-empty
set and empty
unset
Por cierto, recomiendo usar set -u
lo que causará un error al leer variables no establecidas, esto puede salvarlo de desastres como
rm -rf $dir
Puede leer sobre esta y otras mejores prácticas para un "modo estricto" aquí .