Побег в тестовых сравнениях - PullRequest
0 голосов
/ 09 августа 2010

Далее я хотел бы проверить, задано ли заданное имя переменной:

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

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

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

1 Ответ

0 голосов
/ 09 августа 2010

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

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

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

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

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

  • Портативно: eval "tmp=\$$1"; [ -z "$tmp" ]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...