bash - saber - shell script linux español
Cómo encontrar si una variable está o no vacía en Bash (10)
En bash al menos el siguiente comando prueba si $ var está vacío :
if [[ -z "$var" ]]; then
#do what you want
fi
La man test
comando es tu amiga.
¿Cómo puedo verificar si una variable está vacía en Bash?
Es posible que desee distinguir entre variables no definidas y variables que están configuradas 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
que causará un error al leer las variables no configuradas, esto puede salvarlo de desastres como
rm -rf $dir
Puede leer sobre esta y otras mejores prácticas para un "modo estricto" here .
Esto devolverá true
si una variable no está establecida o se establece 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
La pregunta pregunta cómo verificar si una variable es una cadena vacía y las mejores respuestas ya se dieron para eso.
Pero aterricé aquí después de pasar un período de programación en php y lo que estaba buscando en realidad era una verificación como la función vacía en php que funciona 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 empty en php hubiera sido tan útil en mi código de bash.
Como creo que esto puede suceder a otros, decidí convertir la función php vacía en bash
Según el manual de php :
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 flotador)
- "0" (0 como una cadena)
- una matriz vacía
- Una variable declarada, pero sin valor.
Por supuesto, los casos nulos y falsos 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
Manifestación:
el siguiente fragmento de código:
#!/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
Habiendo dicho que en una lógica de bash, las comprobaciones en 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 la primera.
Para comprobar si la variable v no está configurada
if [ "$v" == "" ]; then
echo "v not set"
fi
Suponiendo que bash
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
Tambien he visto
if [ "x$variable" = "x" ]; then ...
Lo que obviamente es muy robusto y concha independiente.
Además, hay una diferencia entre "vacío" y "sin establecer". Consulte ¿Cómo saber si una cadena no está definida en un script de shell bash? .
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
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.
if [[ "$variable" == "" ]] ...