colchetes duplos são inúteis aqui. pode ser simples [-z "$ var"] ou imho ainda mais fácil se o teste -z "var" .. qualquer maneira +1 :)
Luca Borrione
2
colchetes duplos duplos não são inúteis, se eu não incluir, não estou ./test.ksh[8]: test: argument expectedentendendo o motivo, mas o colchete único não funcionou, mas o duplo o teve.
precisa saber é o seguinte
8
@LucaBorrione Eu acho que você quer dizer if test -z "$var", certo?
Neu242
1
Apenas um comentário adicionado para uma situação específica não mencionada diretamente na pergunta: se a variável estiver desabilitada e a set -uopção tiver sido ativada, este teste falhará unbound variable. Nesse caso, você pode preferir a solução do @ alexli.
anol
3
@LucaBorrione Assim como uma nota lateral tardia: "[[" pode ser visto como "nunca inútil"; como usar "[[" tem algumas vantagens sobre "[" (consulte stackoverflow.com/questions/669452/… por exemplo))
A resposta mais direta é -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman
4
@ Jackman Jennifer: bom comentário; é verdade que -zestá mais próximo do que foi solicitado. Jay colocou isso em sua resposta, então evitarei atualizar o meu e deixarei como está.
ChristopheD
48
Eu também vi
if["x$variable"="x"];then...
que é obviamente muito robusto e independente de shell.
Parece estranho para mim. Poderia, por favor, explicar esta solução. Obrigado.
guettli
2
@ guettli: Se $variableestiver 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 $variableestá vazio ou não. Como complemento (3 anos e meio após o fato :-)) eu nunca usaria isso pessoalmente, pois -zfaz 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.
Daniel Andersson
30
if[ ${foo:+1}]then
echo "yes"fi
imprime yesse a variável estiver definida. ${foo:+1}retornará 1 quando a variável estiver definida, caso contrário, retornará uma string vazia.
Embora não seja mencionado na pergunta, uma vantagem importante dessa resposta é que ela funciona mesmo quando a variável não está definida e a set -uopção ( nounset) está ativada. Quase todas as outras respostas a esta pergunta falharão unbound variableneste caso.
anol
Essa :+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}
Apenas para fazer uma distinção entre as duas declarações, ou seja, utilizando ! [ -z "$MyVar" ]significaria que a variável que tem algo nele. Mas, idealmente, alguém usaria else.
3kstc 19/06
6
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.
uma variável é considerada vazia se não existir ou se seu valor for um dos seguintes:
"" (uma sequência vazia)
0 (0 como um número inteiro)
0,0 (0 como um flutuador)
"0" (0 como uma sequência)
uma matriz vazia
uma variável declarada, mas sem um valor
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 passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Exemplo de uso:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
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.
Respostas:
No Bash, pelo menos, o seguinte comando testa se $ var está vazio :
O comando
man test
é seu amigo.fonte
./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:
fonte
-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
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 .
fonte
$variable
estiver vazio, a string à esquerda do operador de comparação se tornará apenasx
, 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.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.fonte
set -u
opção (nounset
) está ativada. Quase todas as outras respostas a esta pergunta falharãounbound 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}
fonte
fonte
${variable:-default_value}
[ "$variable" ] || exit
Isso retornará
true
se uma variável estiver desconfigurada ou definida como a sequência vazia ("").fonte
elif !
vez deelse
?! [ -z "$MyVar" ]
significaria que a variável que tem algo nele. Mas, idealmente, alguém usariaelse
.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.
Exemplo de uso:
Demonstração:
O seguinte trecho:
saídas:
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.
fonte
Convém distinguir entre variáveis não definidas e variáveis definidas e vazias:
Resultado:
BTW, eu recomendo usar o
set -u
que causará um erro ao ler variáveis não definidas, isso pode evitar que desastres comoVocê pode ler sobre esta e outras práticas recomendadas para um "modo estrito" aqui .
fonte
Para verificar se a variável v não está configurada
fonte