Esta é uma maneira correta de testar se um parâmetro é declarado?

0

Este é um exemplo do link

A different, bash-specific way of testing whether a variable of any type has been declared is to check whether it's listed in ${!PREFIX*}:

case " ${!foobar*} " in
  *" foobar "*) echo "foobar is declared";;
  *) echo "foobar is not declared";;
esac
  1. Se eu estiver correto, para fazer um parâmetro não declarado, usamos unset builtin. O caso unset funciona como a citação disse,

    $ unset foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    mas o caso declare d não faz:

    $ unset foobar
    $ declare foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    Esta é uma maneira correta de testar se um parâmetro é declarado?

  2. Também em " ${!foobar*} " , por que há espaços antes e depois do expansão de parâmetro? Funciona quando foobar é uma matriz ou ditinária e quando é uma variável, mas não uma matriz ou dicionário?
por Tim 02.05.2016 / 16:28

1 resposta

2
  1. Parece que você precisa declarar a variável com um valor (pode ser nulo):

    unset foobar; declare foobar=
    

    A instrução case produzirá "foobar declarado".

  2. você usa aspas e espaços para que o *" foobar "* possa detectar o nome da variável específica fora da lista de nomes de variáveis retornados por ${!foobar*} :

    $ unset foobar; foobarbaz=1; foobarquz=2
    $ echo " ${!foobar*} "
     foobarbaz foobarquz 
    

    A instrução case produzirá "foobar não declarada".

por 02.05.2016 / 22:05

Tags