AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 7503
Accepted
Brent
Brent
Asked: 2009-05-13 09:54:48 +0800 CST2009-05-13 09:54:48 +0800 CST 2009-05-13 09:54:48 +0800 CST

Como determinar se uma variável bash está vazia?

  • 772

Qual é a melhor maneira de determinar se uma variável no bash está vazia ("")?

Ouvi dizer que é recomendado que eu façaif [ "x$variable" = "x" ]

Essa é a maneira correta ? (deve haver algo mais simples)

scripting bash variables
  • 15 15 respostas
  • 1279404 Views

15 respostas

  • Voted
  1. Best Answer
    duffbeer703
    2009-05-13T10:06:44+08:002009-05-13T10:06:44+08:00

    Isso retornará true se uma variável não estiver definida ou definida para a string vazia ("").

    if [ -z "${VAR}" ];
    
    • 1227
  2. Dennis Williamson
    2012-02-25T19:37:43+08:002012-02-25T19:37:43+08:00

    No Bash, quando você não está preocupado com a portabilidade para shells que não o suportam, você deve sempre usar a sintaxe de colchetes duplos:

    Qualquer um dos seguintes:

    if [[ -z $variable ]]
    if [[ -z "$variable" ]]
    if [[ ! $variable ]]
    if [[ ! "$variable" ]]
    

    No Bash, usando colchetes duplos, as aspas não são necessárias. Você pode simplificar o teste para uma variável que contém um valor para:

    if [[ $variable ]]
    

    Esta sintaxe é compatível com ksh (pelo menos ksh93, de qualquer maneira). Ele não funciona em shells POSIX puros ou Bourne mais antigos, como sh ou dash.

    Veja minha resposta aqui e BashFAQ/031 para obter mais informações sobre as diferenças entre colchetes duplos e simples.

    Você pode testar para ver se uma variável não está definida especificamente (diferente de uma string vazia):

    if [[ -z ${variable+x} ]]
    

    onde o "x" é arbitrário.

    Se você quiser saber se uma variável é nula, mas não unset:

    if [[ -z $variable && ${variable+x} ]]
    
    • 299
  3. Richard Hansen
    2012-04-25T12:39:38+08:002012-04-25T12:39:38+08:00

    Uma variável no bash (e qualquer shell compatível com POSIX) pode estar em um dos três estados:

    • desarmar
    • definido para a string vazia
    • definido como uma string não vazia

    Na maioria das vezes, você só precisa saber se uma variável está definida como uma string não vazia, mas ocasionalmente é importante distinguir entre não definida e definida como uma string vazia.

    A seguir estão exemplos de como você pode testar as várias possibilidades e funciona no bash ou em qualquer shell compatível com POSIX:

    if [ -z "${VAR}" ]; then
        echo "VAR is unset or set to the empty string"
    fi
    if [ -z "${VAR+set}" ]; then
        echo "VAR is unset"
    fi
    if [ -z "${VAR-unset}" ]; then
        echo "VAR is set to the empty string"
    fi
    if [ -n "${VAR}" ]; then
        echo "VAR is set to a non-empty string"
    fi
    if [ -n "${VAR+set}" ]; then
        echo "VAR is set, possibly to the empty string"
    fi
    if [ -n "${VAR-unset}" ]; then
        echo "VAR is either unset or set to a non-empty string"
    fi
    

    Aqui está a mesma coisa, mas em forma de tabela acessível:

                            +-------+-------+-----------+
                    VAR is: | unset | empty | non-empty |
    +-----------------------+-------+-------+-----------+
    | [ -z "${VAR}" ]       | true  | true  | false     |
    | [ -z "${VAR+set}" ]   | true  | false | false     |
    | [ -z "${VAR-unset}" ] | false | true  | false     |
    | [ -n "${VAR}" ]       | false | false | true      |
    | [ -n "${VAR+set}" ]   | false | true  | true      |
    | [ -n "${VAR-unset}" ] | true  | false | true      |
    +-----------------------+-------+-------+-----------+
    

    A ${VAR+foo}construção se expande para a string vazia se não estiver definida VARou para foose VARestiver definida para qualquer coisa (incluindo a string vazia).

    A ${VAR-foo}construção se expande para o valor de VARif set (incluindo set para a string vazia) e fooif unset. Isso é útil para fornecer padrões substituíveis pelo usuário (por exemplo, ${COLOR-red}diz para usar reda menos que a variável COLORtenha sido definida como algo).

    A razão pela qual [ x"${VAR}" = x ]é frequentemente recomendado para testar se uma variável não está definida ou definida para a string vazia é porque algumas implementações do [comando (também conhecido como test) são bugadas. Se VARfor definido como algo como -n, algumas implementações farão a coisa errada quando fornecidas [ "${VAR}" = "" ]porque o primeiro argumento de [é interpretado erroneamente como o -noperador, não como uma string.

    • 294
  4. Amandasaurus
    2009-06-12T05:19:09+08:002009-06-12T05:19:09+08:00

    -zé a melhor maneira.

    Outra opção que usei é definir uma variável, mas pode ser substituída por outra variável, por exemplo

    export PORT=${MY_PORT:-5432}
    

    Se a $MY_PORTvariável estiver vazia, PORTserá definida como 5432, caso contrário, PORT será definida como o valor de MY_PORT. Observe que a sintaxe inclui os dois pontos e o traço.

    • 44
  5. MikeyB
    2009-05-13T10:21:43+08:002009-05-13T10:21:43+08:00

    Se você estiver interessado em distinguir os casos de status set-empty versus unset, veja a opção -u para bash:

    $ set -u
    $ echo $BAR
    bash: BAR: unbound variable
    $ [ -z "$BAR" ] && echo true
    bash: BAR: unbound variable
    $ BAR=""
    $ echo $BAR
    
    $ [ -z "$BAR" ] && echo true
    true
    
    • 25
  6. errant.info
    2011-10-20T19:58:35+08:002011-10-20T19:58:35+08:00

    Uma alternativa que vi [ -z "$foo" ]é a seguinte, porém não sei por que as pessoas usam esse método, alguém sabe?

    [ "x${foo}" = "x" ]
    

    De qualquer forma, se você estiver desabilitando variáveis ​​não definidas (por set -uou set -o nounset), você terá problemas com ambos os métodos. Há uma correção simples para isso:

    [ -z "${foo:-}" ]
    

    Nota: isso deixará sua variável indef.

    • 8
  7. Luca Borrione
    2012-09-01T12:11:38+08:002012-09-01T12:11:38+08:00

    A pergunta pergunta como verificar se uma variável é uma string vazia e as melhores respostas já foram dadas para isso.
    Mas cheguei aqui depois que um período passou programando em php e o que eu estava realmente procurando era uma verificação como a função vazia em 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 empty in php teria sido muito útil no meu código bash.
    Como acho que isso pode acontecer com outras pessoas, resolvi converter a função vazia do php em 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 string vazia)
    • 0 (0 como um número inteiro)
    • 0,0 (0 como um float)
    • "0" (0 como uma string)
    • uma matriz vazia
    • uma variável declarada, mas sem um valor

    É claro que os casos nulo e falso não podem ser convertidos em bash, então 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
    

    Tendo dito que em uma lógica bash as verificações em zero nesta função podem causar problemas colaterais imho, qualquer pessoa que use esta função deve avaliar esse risco e talvez decidir cortar essas verificações deixando apenas a primeira.

    • 6
  8. namewithoutwords
    2010-01-27T06:02:09+08:002010-01-27T06:02:09+08:00

    todo o if-then e -z são desnecessários.

    [ "$foo" ] && echo "foo não está vazio"
    [ "$foo" ] || echo "foo está realmente vazio"
    
    • 5
  9. Fedir RYKHTIK
    2011-12-10T07:15:29+08:002011-12-10T07:15:29+08:00

    Pessoalmente, prefiro uma maneira mais clara de verificar:

    if [ "${VARIABLE}" == "" ]; then
      echo VARIABLE is empty
    else
      echo VARIABLE is not empty
    fi
    
    • 5
  10. gluk47
    2015-11-10T08:46:15+08:002015-11-10T08:46:15+08:00

    Meus 5 centavos: também existe uma sintaxe mais curta que if ..., esta:

    VALUE="${1?"Usage: $0 value"}"
    

    Esta linha definirá VALUE se um argumento tiver sido fornecido e imprimirá uma mensagem de erro prefixada com o número da linha do script em caso de erro (e encerrará a execução do script).

    Outro exemplo pode ser encontrado no guia abs (procure por «Exemplo 10-7»).

    • 5

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Resolver o nome do host do endereço IP

    • 8 respostas
  • Marko Smith

    Como posso classificar a saída du -h por tamanho

    • 30 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    Qual é o utilitário de linha de comando no Windows para fazer uma pesquisa reversa de DNS?

    • 14 respostas
  • Marko Smith

    Como verificar se uma porta está bloqueada em uma máquina Windows?

    • 4 respostas
  • Marko Smith

    Qual porta devo abrir para permitir a área de trabalho remota?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    MikeN No Nginx, como posso reescrever todas as solicitações http para https mantendo o subdomínio? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 Qual é a diferença entre colchetes duplos e simples no bash? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch Como altero a senha da minha chave privada? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt Como funciona a sub-rede IPv4? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve