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