Desde o Ubuntu 12.04 LTS (e talvez um pouco antes disso, mas não desde 10.04 LTS), a versão bash no Ubuntu tem sido pelo menos 4.2 . Assim isso suporta o operador -v dos test , [ e [[ builtins .
Se você aprender apenas uma maneira de testar se as variáveis são definidas no bash, provavelmente deve ser o expansão de parâmetro técnica usada na excelente resposta de John1024. Mesmo que os sistemas Ubuntu usando bash 4.1 e anteriores estejam se tornando cada vez mais incomuns, o 10.04 ainda tem suporte limitado ao servidor, e versões anteriores do bash são muito mais comum em alguns outros sistemas GNU / Linux (e outros sistemas operacionais baseados em Unix).
Mas se você tiver o bash 4.2 ou superior, o "melhor formato de saída" da resposta do John1024 pode ser ainda mais simplificado para :
def() { [ -v "" ] || echo 'Variable not defined'; }
Observe que, se foo for o nome da variável na qual você está interessado, [ -v foo ] - não [ -v $foo ] - testa se estiver definido. Neste caso, eu tenho $1 porque o primeiro parâmetro posicional passado para def conterá o nome da variável a ser testada como seu valor . (O $ no meu exemplo atinge o mesmo nível adicional de indireto obtido por ! na expressão ${...} de o exemplo de John1024 .
ek@Ilex:~$ def() { [ -v "" ] || echo 'Variable not defined'; }
ek@Ilex:~$ def PATH
ek@Ilex:~$ def NONESUCH
Variable not defined
Meus e John1024's def imprimirão Variable not defined :
- quando nenhuma variável pelo nome é transmitida enquanto o primeiro argumento da função existe
-
mas também quando nenhum primeiro argumento é passado para
def .
Isto é:
ek@Ilex:~$ def
Variable not defined
Se você preferir uma mensagem separada nessa situação, poderá lidar com o caso de def sem receber argumentos separadamente:
def() {
if [ $# -eq 0 ]; then
echo 'error: too few arguments' >&2
return 1
elif [ ! -v "" ]; then
echo 'Variable not defined'
fi
}
Escrevi isso com base na idéia de que ter o primeiro argumento de def , seja ou não uma variável definida, é considerada uma operação normal e não um erro. Em contraste, não passar nenhum argumento para def é um erro e eu o tratei como tal:
-
>&2 envia a saída de echo para < a href="https://en.wikipedia.org/wiki/Standard_streams#Standard_error_.28stderr.29"> erro padrão .
-
return 1 faz com que def retorne com status de saída diferente de zero, indicando falha. (Isso é útil principalmente quando uma chamada para def aparecerá em vez de uma instrução ou script composto, embora o status de saída do último comando também possa ser verificado com echo $? .)
Em outros casos, def retornará o status de saída padrão de 0 (a menos que haja algum outro erro, como echo não conseguir gravar Variable not defined para standard output ).
ek@Ilex:~/source$ def NONESUCH
Variable not defined
ek@Ilex:~/source$ def
error: too few arguments