逃避测试比较

时间:2010-08-09 10:13:12

标签: shell variables comparison escaping

在下面,我想检查是否设置了给定的变量名称:

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

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

由于$hello未设置,我希望测试返回true。这有什么不对?我会假设我错误地逃避了美元 TYIA

1 个答案:

答案 0 :(得分:0)

您正在测试\$$1是否为空。因为它以$开头,所以它不是空的。实际上,\$$1会扩展为字符串$hello

您需要告诉shell您要将$1的值视为要展开的参数的名称。

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

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

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

  • 便携式:eval "tmp=\$$1"; [ -z "$tmp" ]

(请注意,这些将以相同的方式处理未设置和空白,这通常是正确的。)