Como posso verificar se uma variável está vazia no Bash?
Como posso verificar se uma variável está vazia no Bash?
Respostas:
No Bash, pelo menos, o seguinte comando testa se $ var está vazio :
if [[ -z "$var" ]]; then
# Do what you want
fi
O comando man test
é seu amigo.
./test.ksh[8]: test: argument expected
entendendo o motivo, mas o colchete único não funcionou, mas o duplo o teve.
if test -z "$var"
, certo?
set -u
opção tiver sido ativada, este teste falhará unbound variable
. Nesse caso, você pode preferir a solução do @ alexli.
Presumindo Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
está mais próximo do que foi solicitado. Jay colocou isso em sua resposta, então evitarei atualizar o meu e deixarei como está.
Eu também vi
if [ "x$variable" = "x" ]; then ...
que é obviamente muito robusto e independente de shell.
Além disso, há uma diferença entre "vazio" e "não configurado". Consulte Como saber se uma sequência de caracteres não está definida em um script de shell do Bash .
$variable
estiver vazio, a string à esquerda do operador de comparação se tornará apenas x
, o que é igual à string à direita do operador. [ x = x ]
é "verdadeiro", portanto, na prática, isso testa se $variable
está vazio ou não. Como complemento (3 anos e meio após o fato :-)) eu nunca usaria isso pessoalmente, pois -z
faz o que provavelmente quero de uma maneira mais clara, mas queria acrescentar essa resposta, pois esse método é frequentemente visto "em estado selvagem"; talvez escrito dessa maneira de propósito por pessoas que tiveram experiências diferentes das minhas.
if [ ${foo:+1} ]
then
echo "yes"
fi
imprime yes
se a variável estiver definida. ${foo:+1}
retornará 1 quando a variável estiver definida, caso contrário, retornará uma string vazia.
set -u
opção ( nounset
) está ativada. Quase todas as outras respostas a esta pergunta falharão unbound variable
neste caso.
:+
notação também é útil para situações em que você possui parâmetros opcionais de linha de comando que você especificou com variáveis opcionais. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Isso retornará true
se uma variável estiver desconfigurada ou definida como a sequência vazia ("").
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 !
vez de else
?
! [ -z "$MyVar" ]
significaria que a variável que tem algo nele. Mas, idealmente, alguém usaria else
.
A pergunta pergunta como verificar se uma variável é uma sequência vazia e as melhores respostas já foram dadas para isso.
Mas cheguei aqui depois de um período passado na programação em PHP e estava realmente procurando por uma verificação como a função vazia no PHP trabalhando em um shell Bash.
Depois de ler as respostas, percebi que não estava pensando corretamente no Bash, mas, de qualquer forma, naquele momento, uma função como vazia no PHP teria sido muito útil no meu código Bash.
Como acho que isso pode acontecer com outras pessoas, decidi converter a função vazia do PHP no Bash.
De acordo com o manual do PHP :
uma variável é considerada vazia se não existir ou se seu valor for um dos seguintes:
Obviamente, os casos nulos e falsos não podem ser convertidos no bash; portanto, eles são omitidos.
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 "" ) ]]
}
Exemplo de uso:
if empty "${var}"
then
echo "empty"
else
echo "not empty"
fi
Demonstração:
O seguinte trecho:
#!/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
saídas:
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
Dito isto, em uma lógica Bash, as verificações com zero nesta função podem causar problemas colaterais, qualquer pessoa que use esta função deve avaliar esse risco e talvez decidir cortar essas verificações deixando apenas a primeira.
Convém distinguir entre variáveis não definidas e variáveis definidas e vazias:
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
BTW, eu recomendo usar o set -u
que causará um erro ao ler variáveis não definidas, isso pode evitar que desastres como
rm -rf $dir
Você pode ler sobre esta e outras práticas recomendadas para um "modo estrito" aqui .