2010-08-09 6 views
0

Dans ce qui suit, je voudrais vérifier si un nom de variable est définie:Échapper dans les comparaisons de test

$ set hello 
$ echo $1 
hello 
$ echo $hello 

$ [[ -z \$$1 ]] && echo true || echo false 
false 

Depuis $hello est unset, je pense que le test retour true. Quel est le problème ici? Je suppose que j'échappe incorrectement au dollar.
TYIA

Répondre

0

Vous testez si \$$1 est vide. Comme il commence par $, il n'est pas vide. En fait, \$$1 se développe à la chaîne $hello.

Vous devez indiquer au shell que vous souhaitez traiter la valeur de $1 comme nom d'un paramètre à développer.

  • Avec bash: [[ -z ${!1} ]]

  • Avec zsh: [[ -z ${(P)1} ]]

  • Avec ksh: tmp=$1; typeset -n tmp; [[ -z $tmp ]]

  • portably: eval "tmp=\$$1"; [ -z "$tmp" ]

(Notez que ceux-ci traiteront unset empty vide de manière identique, ce qui est généralement la bonne chose.)

+0

Une autre façon de 'ksh':' typeset -n tmp; tmp = 1 $; [[-z $ tmp]] ... '(J'aime éviter autant que possible" eval "(même si c'est sûr dans cette circonstance) –

+0

@Dennis: merci, il est bon de savoir qu'il y a un moyen dans ksh aussi (et je n'aime pas 'eval' non plus, mais c'est la seule façon portable). – Gilles