Como descobrir se uma variável está ou não vazia no Bash


262

Como posso verificar se uma variável está vazia no Bash?


2
Que tipo de script de shell? * nix?
TJ Crowder

8
script shell do bash
Árvore



Respostas:


383

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.


62
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))
GhostCat

107

Presumindo Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

9
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.

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 .


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.


2
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}
Alan Porter


10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

Ótima maneira de padronizar uma var, mais 1
ehime

@ehime para criar um valor padrão que você usaria #${variable:-default_value}
warvariuc

Esta é uma maneira rápida de verificar a validade de uma entrada de uma variável e sair se não estiver definida: [ "$variable" ] || exit
Marcel Sonderegger

8

Isso retornará truese 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

3
Por que você usaria em elif !vez de else?
ZiggyTheHamster 18/11/2015

1
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.

De acordo com o manual do PHP :

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 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.


2

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 -uque 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 .


Obrigado pela referência ao modo estrito!
paulcm

1

Para verificar se a variável v não está configurada

if [ "$v" == "" ]; then
   echo "v not set"
fi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.