Como verificar se uma variável está definida na Bash?

Como sei se uma variável é definida na Bash?

por exemplo, Como posso verificar se o utilizador deu o primeiro parâmetro a uma função?

function a {
    # if $1 is set ?
}
Author: nbro, 2010-08-30

30 answers

(Normalmente) o caminho certo

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

Onde ${var+x} é uma expansão de parâmetros que não avalia nada se var está desactivada, e substitui a cadeia x caso contrário.

Aspas De Digressão

As aspas podem ser omitidas (por isso podemos dizer ${var+x} em vez de "${var+x}") porque esta sintaxe e utilização garante que isto só irá expandir-se para algo que não necessita de aspas (uma vez que se expande para x (que não contém quebras de palavras, por isso não precisa de aspas), ou a nada (o que resulta em [ -z ], que convenientemente avalia ao mesmo valor (verdadeiro) que [ -z "" ] também faz).

No entanto, embora as citações possam ser omitidas com segurança, e não fosse imediatamente óbvio para todos (não era sequer aparente para o primeiro autor desta explicação de citações que também é um grande programador Bash), às vezes seria melhor escrever a solução com aspas como {[[10]}, ao custo muito pequeno possível de uma pena de Velocidade O(1). O primeiro autor também acrescentou isto como um comentário ao lado do código usando esta solução dando a URL para esta resposta, que agora também inclui a explicação para o porquê das citações podem ser omitidas com segurança.

(muitas vezes) o caminho errado

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

Isto é muitas vezes errado porque não distingue entre uma variável que está desactivada e uma variável que está configurada para a cadeia vazia. Isto é, se var='', então a solução acima produzirá "var é em branco".

A distinção entre unset e set to the string vazia " é essencial em situações em que o utilizador tem de indicar uma extensão ou uma lista adicional de propriedades, e que não as indicar por omissão é um valor não-vazio, ao passo que a especificação do string vazio deverá fazer com que o programa use uma extensão ou lista vazia de propriedades adicionais.

A distinção pode não ser essencial em todos os cenários. Nesses casos {[12] } vai ficar bem.

 1678
Author: Lionel, 2018-06-15 18:39:20

Para verificar se existe uma variável de cadeia não nula/ não nula, ou seja, se estiver definida, utilizar

if [ -n "$1" ]
É o oposto de -z. Dou por mim a usar -n mais do que -z.
 676
Author: mbrannig, 2013-10-13 15:42:36

Aqui está como testar se um parâmetro é desactivado , ou vazio ("nulo") ou definido com um valor:

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

Fonte: POSIX: expansão do parâmetro:

Em todos os casos apresentados com "Substituto", a expressão é substituída pelo valor indicado. Em todos os casos mostrados com "assign", parâmetro é atribuído esse valor, que também substitui a expressão.

 400
Author: Jens, 2016-08-11 17:19:35

Há muitas maneiras de fazer isto com o seguinte sendo um deles:

if [ -z "$1" ]

Isto tem sucesso se $1 for nulo ou desactivado

 168
Author: ennuikiller, 2016-03-07 22:55:45

Enquanto a maioria das técnicas aqui indicados estão correctos, bash 4.2 suporta um teste real para a presença de uma variável (man bash), em vez de testar o valor da variável.

[[ -v foo ]]; echo $?
# 1

foo=bar
[[ -v foo ]]; echo $?
# 0

foo=""
[[ -v foo ]]; echo $?
# 0
 154
Author: Russell Harmon, 2017-03-11 19:46:43

Para ver se uma variável não está vazia, Eu uso

if [[ $var ]]; then ...       # `$var' expands to a nonempty string

Os testes opostos se uma variável estiver desligada ou vazia:

if [[ ! $var ]]; then ...     # `$var' expands to the empty string (set or not)

Para ver se uma variável está definida( vazia ou não vazia), Eu uso

if [[ ${var+x} ]]; then ...   # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ...     # Parameter 1 exists (empty or nonempty)

Os testes opostos se uma variável estiver desligada:

if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ...   # We were called with no arguments
 57
Author: phkoester, 2013-05-08 08:32:46

Encontro sempre a mesa POSIX na outra resposta lenta para grok, por isso aqui está a minha opinião:

   +----------------------+------------+-----------------------+-----------------------+
   |   if VARIABLE is:    |    set     |         empty         |        unset          |
   +----------------------+------------+-----------------------+-----------------------+
 - |  ${VARIABLE-default} | $VARIABLE  |          ""           |       "default"       |
 = |  ${VARIABLE=default} | $VARIABLE  |          ""           | $(VARIABLE="default") |
 ? |  ${VARIABLE?default} | $VARIABLE  |          ""           |       exit 127        |
 + |  ${VARIABLE+default} | "default"  |       "default"       |          ""           |
   +----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE  |       "default"       |       "default"       |
:= | ${VARIABLE:=default} | $VARIABLE  | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE  |       exit 127        |       exit 127        |
:+ | ${VARIABLE:+default} | "default"  |          ""           |          ""           |
   +----------------------+------------+-----------------------+-----------------------+

Note que cada grupo (com e sem dois pontos anteriores) tem o mesmo conjunto e os estojos, de modo que a única coisa que difere é como os vazios são tratados.

Com o cólon anterior, os casos vazios e desactivados são idênticos, por isso eu usaria aqueles sempre que possível( isto é, usar :=, não apenas =, porque o caso vazio é inconsistente).

Rubricas:

  • Conjunto significa que VARIABLE não está vazio (VARIABLE="something")
  • vazio significa VARIABLE vazio/nulo (VARIABLE="")
  • desactivado significa que VARIABLE não existe (unset VARIABLE)

Valores:

  • $VARIABLE significa que o resultado é o valor original da variável.
  • "default" significa que o resultado foi a cadeia de substituição fornecido.
  • "" significa que o resultado é nulo (um texto vazio).
  • exit 127 significa que o programa pára de ser executado com o código de saída 127.
  • $(VARIABLE="default") significa que o resultado é o valor original da variável e a cadeia de substituição fornecida é atribuída à variável para utilização futura.
 37
Author: deizel, 2017-08-24 16:48:20

Em uma versão moderna de Bash (4.2 ou mais tarde eu penso; eu não sei ao certo), eu tentaria isto:

if [ ! -v SOMEVARIABLE ] #note the lack of a $ sigil
then
    echo "Variable is unset"
elif [ -z "$SOMEVARIABLE" ]
then
    echo "Variable is set to an empty string"
else
    echo "Variable is set to some string"
fi
 31
Author: Seamus Connor, 2015-11-10 16:02:25
if [ "$1" != "" ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi

Embora para argumentos é normalmente melhor testar $#, que é o número de argumentos, na minha opinião.

if [ $# -gt 0 ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi
 18
Author: Paul Creasey, 2010-08-30 16:43:46

Leia a secção "expansão de Parâmetros" da página de manual bash. A expansão do parâmetro não fornece um teste geral para uma variável sendo definida, mas há várias coisas que você pode fazer a um parâmetro se ele não estiver definido.

Por exemplo:

function a {
    first_arg=${1-foo}
    # rest of the function
}

Será igual a first_arg Se for atribuído, caso contrário usa o valor "foo". Se a tiver absolutamente de tomar um único parâmetro, e não existir um bom padrão, poderá sair com uma mensagem de erro quando não existir nenhum parâmetro dado:

function a {
    : ${1?a must take a single argument}
    # rest of the function
}

(Note o uso de : como um comando nulo, que apenas expande os valores dos seus argumentos. Nós não queremos fazer nada com $1 Neste exemplo, basta sair se não estiver definido)

 14
Author: chepner, 2012-01-31 22:05:06

Queres sair se estiver desligado

Isto funcionou comigo. Eu queria que o meu script saísse com uma mensagem de erro se um parâmetro não estivesse definido.
#!/usr/bin/env bash

set -o errexit

# Get the value and empty validation check all in one
VER="${1:?You must pass a version of the format 0.0.0 as the only argument}"

Isto devolve com um erro quando é executado

peek@peek:~$ ./setver.sh
./setver.sh: line 13: 1: You must pass a version of the format 0.0.0 as the only argument

Verifique apenas, nenhuma saída-vazia e desactivada são inválidas {[[8]}

Tente esta opção se apenas quiser verificar se o valor definido=válido ou desactivado/vazio=inválido.

TSET="good val"
TEMPTY=""
unset TUNSET

if [ "${TSET:-}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TEMPTY:-}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID
if [ "${TUNSET:-}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID

Ou, mesmo testes curtos; -)

[ "${TSET:-}"   ] && echo "VALID" || echo "INVALID"
[ "${TEMPTY:-}" ] && echo "VALID" || echo "INVALID"
[ "${TUNSET:-}" ] && echo "VALID" || echo "INVALID"

Verifique apenas, nenhuma saída-apenas vazio é Inválido

E esta é a resposta à pergunta. Use isto se quiser apenas verificar se o valor definido/vazio=válido ou desactivado=inválido.

Nota, o " 1 "em"..- "É insignificante, pode ser qualquer coisa (como x)

TSET="good val"
TEMPTY=""
unset TUNSET

if [ "${TSET+1}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TEMPTY+1}" ]; then echo "VALID"; else echo "INVALID";fi
# VALID
if [ "${TUNSET+1}" ]; then echo "VALID"; else echo "INVALID";fi
# INVALID

Testes curtos

[ "${TSET+1}"   ] && echo "VALID" || echo "INVALID"
[ "${TEMPTY+1}" ] && echo "VALID" || echo "INVALID"
[ "${TUNSET+1}" ] && echo "VALID" || echo "INVALID"
Dedico esta resposta a @mklement0 (comentários) que me desafiou a responder com precisão à pergunta.

Referência http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

 14
Author: Jarrod Chesney, 2016-12-16 04:46:12

Para verificar se uma variável está definida com um valor não-vazio, use {[[0]}, como outros já indicaram.

Na maioria das vezes, é uma boa ideia tratar uma variável que tem um valor vazio da mesma forma que uma variável que está desactivada. Mas podes distinguir os dois se precisares.: [ -n "${x+set}" ] ("${x+set}" expande para set Se x está definido e para o texto vazio se x está desactivado).

Para verificar se um parâmetro foi aprovado, teste $#, que é o número de parâmetros aprovados para a função (ou para o script, quando não em uma função) (veja a resposta de Paulo).

 12
Author: Gilles, 2017-05-23 12:34:53

Na bash pode usar -v dentro do [[ ]] Edifício:

#! /bin/bash -u

if [[ ! -v SOMEVAR ]]; then
    SOMEVAR='hello'
fi

echo $SOMEVAR
 10
Author: AlejandroVD, 2016-03-28 21:13:34

Para aqueles que procuram verificar se estão desligados ou vazios quando num programa com set -u:

if [ -z "${var-}" ]; then
   echo "Must provide var environment variable. Exiting...."
   exit 1
fi

A verificação regular [ -z "$var" ] falhará com var; unbound variable se set -u mas [ -z "${var-}" ] expande para um texto vazio se var estiver desactivado sem falhar.

 9
Author: ecerulm, 2016-11-16 11:26:13

Podes fazer:

function a {
        if [ ! -z "$1" ]; then
                echo '$1 is set'
        fi
}
 4
Author: codaddict, 2010-08-31 07:23:26

As respostas acima não funcionam quando a opção Bash set -u está activa. Além disso, eles não são dinâmicos, por exemplo, como testar é variável com o nome de "manequim" é definido? Tenta isto.

is_var_defined()
{
    if [ $# -ne 1 ]
    then
        echo "Expected exactly one argument: variable name as string, e.g., 'my_var'"
        exit 1
    fi
    # Tricky.  Since Bash option 'set -u' may be enabled, we cannot directly test if a variable
    # is defined with this construct: [ ! -z "$var" ].  Instead, we must use default value
    # substitution with this construct: [ ! -z "${var:-}" ].  Normally, a default value follows the
    # operator ':-', but here we leave it blank for empty (null) string.  Finally, we need to
    # substitute the text from $1 as 'var'.  This is not allowed directly in Bash with this
    # construct: [ ! -z "${$1:-}" ].  We need to use indirection with eval operator.
    # Example: $1="var"
    # Expansion for eval operator: "[ ! -z \${$1:-} ]" -> "[ ! -z \${var:-} ]"
    # Code  execute: [ ! -z ${var:-} ]
    eval "[ ! -z \${$1:-} ]"
    return $?  # Pedantic.
}

Relacionado: na Bash, como testar se uma variável é definida no modo "-u"

 4
Author: kevinarpe, 2017-05-23 12:18:27

Usar [[ -z "$var" ]] é a maneira mais fácil de saber se uma variável foi definida ou não, mas essa opção -z não distingue entre uma variável desactivada e uma variável configurada para um texto vazio:

$ set=''
$ [[ -z "$set" ]] && echo "Set" || echo "Unset" 
Unset
$ [[ -z "$unset" ]] && echo "Set" || echo "Unset"
Unset

É melhor verificar de acordo com o tipo de variável: variável env, parâmetro ou variável regular.

Para uma variável env:

[[ $(env | grep "varname=" | wc -l) -eq 1 ]] && echo "Set" || echo "Unset"

Para um parâmetro (por exemplo, para verificar a existência do parâmetro $5):

[[ $# -ge 5 ]] && echo "Set" || echo "Unset"

Para uma variável regular (utilizando um auxiliar função, para fazê-lo de uma forma elegante):

function declare_var {
   declare -p "$1" &> /dev/null
   return $?
}
declare_var "var_name" && echo "Set" || echo "Unset"

Notas:

  • $#: diz que o número de parâmetros posicionais.
  • declare -p: dá-Lhe a definição da variável passada como parâmetro. Se existir, devolve 0, se não, devolve 1 e imprime uma mensagem de erro.
  • $?: dá-lhe o código de Estado do último comando executado.
 2
Author: Peregring-lk, 2018-07-10 08:10:51

Numa linha de comandos pode usar o operador -z que é verdadeiro se o comprimento do texto for zero.

Uma linha simples para definir o valor por omissão MY_VAR Se não estiver definido, caso contrário, opcionalmente, poderá mostrar a mensagem:

[[ -z "$MY_VAR" ]] && MY_VAR="default"
[[ -z "$MY_VAR" ]] && MY_VAR="default" || echo "Variable already set."
 1
Author: kenorb, 2015-11-10 16:04:12

A minha maneira preferida é esta:

$var=10
$if ! ${var+false};then echo "is set";else echo "NOT set";fi
is set
$unset var
$if ! ${var+false};then echo "is set";else echo "NOT set";fi
NOT set

Então, basicamente, se uma variável é definida, ela se torna " uma negação do resultante false "(o que será true = "é definido").

E, se estiver desactivado, tornar-se-á" uma negação do resultante true "(como o resultado vazio avalia true) (assim terminará como sendo false = "não definido").

 1
Author: Aquarius Power, 2015-11-10 16:05:00
if [[ ${1:+isset} ]]
then echo "It was set and not null." >&2
else echo "It was not set or it was null." >&2
fi

if [[ ${1+isset} ]]
then echo "It was set but might be null." >&2
else echo "It was was not set." >&2
fi
 0
Author: solidsnack, 2013-06-30 05:22:39

Eu encontrei um (muito) Código melhor para fazer isso se você quiser verificar para qualquer coisa em {[[2]}.

if [[ $1 = "" ]]
then
  echo '$1 is blank'
else
  echo '$1 is filled up'
fi
Porquê tudo isto? Tudo em $@ existe na Bash, mas por omissão está em branco, por isso test -z e test -n não te puderam ajudar.

Update: Você também pode contar o número de caracteres em um Parâmetros.

if [ ${#1} = 0 ]
then
  echo '$1 is blank'
else
  echo '$1 is filled up'
fi
 0
Author: Zlatan, 2013-12-27 16:30:37
[[ $foo ]]

Ou

(( ${#foo} ))

Ou

let ${#foo}

Ou

declare -p foo
 0
Author: Steven Penny, 2014-05-11 05:43:17
if [[ ${!xx[@]} ]] ; then echo xx is defined; fi
 0
Author: Graham, 2015-08-12 18:43:56

Eu sempre uso este, baseado no fato de que parece fácil de ser entendido por qualquer um que vê o Código pela primeira vez:

if [ "$variable" = "" ]
    then
    echo "Variable X is empty"
fi

E, se quiser verificar se não está vazio,

if [ ! "$variable" = "" ]
    then
    echo "Variable X is not empty"
fi
É isso.
 0
Author: mijnnaam, 2015-11-10 16:03:35

Isto é o que eu uso todos os dias:

#
# Check if a variable is set
#   param1  name of the variable
#
function is_set()
{
    [[ -n "${1}" ]] && test -n "$(eval "echo "\${${1}+x}"")"
}

Isto funciona bem no Linux e no Solaris até ao bash 3.0.

bash-3.00$ myvar="TEST"
bash-3.00$ is_set myvar ; echo $?
0
bash-3.00$ mavar=""
bash-3.00$ is_set myvar ; echo $?
0
bash-3.00$ unset myvar
bash-3.00$ is_set myvar ; echo $?
1
 0
Author: fr00tyl00p, 2015-11-10 16:06:00

SE var pode ser um array, então [ -z "${var+x}" ] Substituição de Parâmetros está incorrecta. Para ter a certeza absoluta na Bash, precisa de usar a sintaxe array como [ "${#var[@]}" = 0 ], Como mostrado em baixo.

is-var-set () {
    results="\${var+x}=${var+x}\t\${#var[@]}=${#var[@]}"
    if [ -z "${var+x}" ] && [ "${#var[@]}" = 0 ]; then
        echo -e "$1: var's unset.\t$results"
    elif [ -n "${var+x}" ] && [ "${#var[@]}" != 0 ]; then
        echo -e "$1: var is set. \t$results"
    else
        echo -e "$1: Is var set? \t$results"
    fi
    unset var # so we don't have to do it everywhere else
}
Em quase todos os casos, eles concordam. A única situação que encontrei onde o método array é mais preciso é quando a variável é uma matriz não-vazia com posição 0 desativada (por exemplo, em testes 7 e A abaixo). Este desacordo vem de {[9] } ser abreviado para ${var[0]}, então [ -z "${var+x}" ] não é a verificar toda a matriz. Aqui estão os meus casos de teste.
unset var;      is-var-set 1 # var unset
var='';         is-var-set 2 # var[0] set to ''
var=foo;        is-var-set 3 # var[0] set to 'foo'
var=();         is-var-set 4 # var unset (all indices)
var=(foo);      is-var-set 5 # var[0] set to 'foo'
var=([0]=foo);  is-var-set 6 # var[0] set to 'foo'
var=([1]=foo);  is-var-set 7 # var[0] unset, but var[1] set to 'foo'
declare -a var; is-var-set 8 # var empty, but declared as an array
declare -A var; is-var-set 9 # var empty, but declared as an associative array
declare -A var  # Because is-var-set() conveniently unsets it
var=([xz]=foo); is-var-set A # var[xz] set to 'foo', but var's otherwise empty
declare -a var  # Demonstrate that Bash knows about var, even when there's
declare -A var; is-var-set B # apparently no way to just _check_ its existence
Aqui está a saída.
1: var's unset. ${var+x}=       ${#var[@]}=0
2: var is set.  ${var+x}=x      ${#var[@]}=1
3: var is set.  ${var+x}=x      ${#var[@]}=1
4: var's unset. ${var+x}=       ${#var[@]}=0
5: var is set.  ${var+x}=x      ${#var[@]}=1
6: var is set.  ${var+x}=x      ${#var[@]}=1
7: Is var set?  ${var+x}=       ${#var[@]}=1
8: var's unset. ${var+x}=       ${#var[@]}=0
9: var's unset. ${var+x}=       ${#var[@]}=0
A: Is var set?  ${var+x}=       ${#var[@]}=1
./foo.sh: line 26: declare: var: cannot convert indexed to associative array
B: var's unset. ${var+x}=       ${#var[@]}=0

Em suma:

  • ${var+x} parameter expansion syntax works just as well as ${#var[@]} array syntax in most cases, such as checking parameters to functions. A única maneira que este caso poderia quebrar é se uma versão futura do Bash adiciona uma maneira de passar arrays para funções sem Converter conteúdo para argumentos individuais.
  • a sintaxe do Array é necessária para não estar vazia arrays (associativos ou não) com o elemento 0 desactivado.
  • nenhuma sintaxe explica o que se passa se declare -a var foi usado sem atribuir um valor nulo algures na matriz. Bash ainda distingue o caso em algum lugar (como visto no teste B acima), então esta resposta não é infalível. Felizmente Bash converte variáveis de ambiente exportadas em strings ao executar um programa/ script, de modo que quaisquer problemas com as variáveis declaradas-mas-desactivadas serão contidos em um único script, pelo menos se não é buscar outros guiões.
 0
Author: Mark Haferkamp, 2016-02-15 14:32:17

Se quiser testar se uma variável está ligada ou não, isto funciona bem, mesmo depois de ter ligado a opção do substantivo:

set -o noun set

if printenv variableName >/dev/null; then
    # variable is bound to a value
else
    # variable is unbound
fi
 -1
Author: user1857592, 2013-05-25 20:08:04
Gosto de funções auxiliares para esconder os detalhes rudes de bash. Neste caso, fazê-lo acrescenta ainda mais crueza (oculta):
# The first ! negates the result (can't use -n to achieve this)
# the second ! expands the content of varname (can't do ${$varname})
function IsDeclared_Tricky
{
  local varname="$1"
  ! [ -z ${!varname+x} ]
}

Porque eu tive erros pela primeira vez nesta implementação (inspirado pelas respostas de Jens e Lionel), eu cheguei a uma solução diferente:

# Ask for the properties of the variable - fails if not declared
function IsDeclared()
{
  declare -p $1 &>/dev/null
}
Acho que é mais directo, mais tímido e mais fácil de entender/lembrar. A caixa de ensaio mostra que é equivalente:
function main()
{
  declare -i xyz
  local foo
  local bar=
  local baz=''

  IsDeclared_Tricky xyz; echo "IsDeclared_Tricky xyz: $?"
  IsDeclared_Tricky foo; echo "IsDeclared_Tricky foo: $?"
  IsDeclared_Tricky bar; echo "IsDeclared_Tricky bar: $?"
  IsDeclared_Tricky baz; echo "IsDeclared_Tricky baz: $?"

  IsDeclared xyz; echo "IsDeclared xyz: $?"
  IsDeclared foo; echo "IsDeclared foo: $?"
  IsDeclared bar; echo "IsDeclared bar: $?"
  IsDeclared baz; echo "IsDeclared baz: $?"
}

main

O estojo de ensaio também mostra que local var não declarar var (excepto se seguido de"="). Durante algum tempo, pensei ter declarado variáveis desta forma, só para descobrir agora que apenas expressei a minha intenção... Acho que não deu em nada.

IsDeclared_Tricky xyz: 1
Isdeclared_ dicky foo: 1
Isdeclared_ dicky bar: 0
IsDeclared_Tricky baz: 0
Xyz IsDeclared: 1
Foo IsDeclared: 1
Barra IsDeclared: 0
Baz IsDeclared: 0

Bônus: usecase

Na maioria das vezes use este teste para dar (e retornar) parâmetros para funções em um um pouco "elegante" e caminho seguro (quase se assemelhando a uma interface...):
#auxiliary functions
function die()
{
  echo "Error: $1"; exit 1
}

function assertVariableDeclared()
{
  IsDeclared "$1" || die "variable not declared: $1"
}

function expectVariables()
{
  while (( $# > 0 )); do
    assertVariableDeclared $1; shift
  done
}

# actual example
function exampleFunction()
{
  expectVariables inputStr outputStr
  outputStr="$inputStr world!"
}

function bonus()
{
  local inputStr='Hello'
  local outputStr= # remove this to trigger error
  exampleFunction
  echo $outputStr
}

bonus

Se chamado com todas as variáveis requer declaração:

Olá, mundo!

Else:

Erro: variável não declarada: outputStr

 -1
Author: Daniel S, 2016-03-01 13:23:29

Funções para verificar se a variável é declarada / desactivada

Incluindo vazio $array=()


O seguinte teste de funções se o nome próprio existe como uma variável

# The first parameter needs to be the name of the variable to be checked.
# (See example below)

var_is_declared() {
    { [[ -n ${!1+anything} ]] || declare -p $1 &>/dev/null;}
}

var_is_unset() {
    { [[ -z ${!1+anything} ]] && ! declare -p $1 &>/dev/null;} 
}
  • por primeiro teste se a variável for (un)definida, a chamada a declarar pode ser evitada, se não for necessário.
  • se no entanto $1 contiver o nome de um $array=() vazio, a chamada a declarar certificar-se-á de que obtemos o resultado certo
  • nunca há muitos dados passados para /dev / null como declarar só é chamado se a variável for desativada ou uma matriz vazia.

Estas funções testariam como demonstrado nas seguintes condições:

a;       # is not declared
a=;      # is declared
a="foo"; # is declared
a=();    # is declared
a=("");  # is declared
unset a; # is not declared

a;       # is unset
a=;      # is not unset
a="foo"; # is not unset
a=();    # is not unset
a=("");  # is not unset
unset a; # is unset

.

Para mais detalhes

E um script de teste Veja a minha resposta à pergunta "Como posso verificar se existe uma variável na bash?".

observação: o uso semelhante de declare -p, como também é mostrado por peregrinando-lk ' s a resposta, é verdadeiramente coincidência. Caso contrário, eu teria creditado!

 -1
Author: Martin Rüegg, 2017-05-23 11:55:03
case "$1" in
 "") echo "blank";;
 *) echo "set"
esac
 -2
Author: ghostdog74, 2010-08-30 15:32:16