¿Cómo encontrar si una variable está vacía en Bash
Pregunta
¿Cómo puedo comprobar si una variable está vacía en Bash?
Solución
En bash, al menos, las siguientes pruebas de comando $ var si está vacía
if [[ -z "$var" ]]; then
#do what you want
fi
El comando man test
es su amigo.
Otros consejos
Presuming bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
También he visto
if [ "x$variable" = "x" ]; then ...
lo que obviamente es muy robusto y cáscara independiente.
Además, hay una diferencia entre el "vacío" y "desactivada". Ver Cómo saber si una cadena no se define en una secuencia de comandos shell bash? .
if [ ${foo:+1} ]
then
echo "yes"
fi
impresiones yes
si se establece la variable. ${foo:+1}
devolverá 1 cuando se establece la variable, en caso contrario devolverá una cadena vacía.
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
Esto devolverá true
si una variable no está definida o el conjunto de 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
La pregunta ??strong> pide cómo comprobar 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 pasó programando en php y lo que en realidad estaba buscando era un cheque como el función de vacío en php de trabajo en un shell bash.
Después de leer las respuestas me di cuenta 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 taaaan útil en mi código bash.
Como creo que esto puede suceder a los demás, decidí convertir la función php vacío en bash
De acuerdo con la php manual de :
una variable se considera vacía si no existe o si su valor es uno de los siguientes:
- "" (una cadena vacía)
- 0 (0 como un entero)
- 0,0 (0 como un flotador)
- "0" (0 como una cadena)
- una matriz vacía
- una variable declarada, pero sin un valor
Por supuesto, el nula y false de los casos no se puede 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 fiesta de los controles de cero en esta función pueden causar problemas secundarios en mi humilde opinión, cualquier persona que utilice esta función debe evaluar este riesgo y tal vez decida cortar esos cheques dejando sólo el primero.
Es posible que desee distinguir entre variables no definidas y las variables que se establecen y vacío:
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
Resultados:
set and non-empty
set and empty
unset
Por cierto, recomiendo el uso de set -u
lo que provocará un error al leer variables no definidas, esto puede ahorrarle de desastres como
rm -rf $dir
Se puede leer sobre esto y otras mejores prácticas para un "modo estricto" aquí .
Para comprobar si la variable v no se establece
if [ "$v" == "" ]; then
echo "v not set"
fi