2010-08-09 2 views
0

В дальнейшем я хотел бы проверить, если данное имя переменной устанавливается:Выбираясь в тестовых сравнениях

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

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

$hello С снята с охраны, я ожидал бы тест, чтобы вернуться true. Что здесь не так? Я бы предположил, что я избегаю доллара неправильно.
TYIA

ответ

0

Вы тестируете, если \$$1 пуст. Поскольку он начинается с $, он не пуст. Фактически, \$$1 расширяется до строки $hello.

Необходимо указать оболочке, что вы хотите обрабатывать значение $1 как имя параметра для расширения.

  • С Баш: [[ -z ${!1} ]]

  • С Zsh: [[ -z ${(P)1} ]]

  • кенийских шиллингов: tmp=$1; typeset -n tmp; [[ -z $tmp ]]

  • Портабельно: eval "tmp=\$$1"; [ -z "$tmp" ]

(Обратите внимание, что они будут обрабатывать unset и empty одинаково, что обычно является правильным.)

+0

Другой способ в 'ksh':' typeset -n tmp; TMP = $ 1; [[-z $ tmp]] ... '(Мне нравится избегать« eval »как можно больше (хотя это безопасно в этом конкретном случае). –

+0

@ Dennis: спасибо, хорошо знать, что есть способ в ksh (и мне тоже не нравится «eval», но это единственный переносимый способ). – Gilles