在bash中从字符串变为变量

时间:2013-04-19 08:46:04

标签: bash substitution

我正在编写一个bash脚本来自动化一些sysadmin的东西。我首先检查是否定义了许多变量。我现在这样做的方式是这样的:

function is_defined {
    if [ -z "$2" ]; then
        echo "$1 is not defined"
        exit
    fi
}

is_defined "PROJECTNAME" $PROJECTNAME

我希望拥有的是一个只接受一个参数的函数:变量名称作为字符串,检查它是否已定义,如果未定义则告诉用户并退出。

在bash中执行此操作的正确替代魔法是什么?

2 个答案:

答案 0 :(得分:2)

这样的事情:

function is_defined {
    if [ -z "${!1}" ]; then
        echo "$1 is not defined"
        exit 1
    fi
}

$ {!a}因为@sehe已经说过将打印变量值,其名称为$ 1

答案 1 :(得分:2)

可以使用奇异参数展开:${!var},它扩展为名称为$var的变量。

版本1

is_defined() {
  if [ -z "${!1}" ]; then
    echo "$1 is not defined"
    exit 1
  fi
}

但我们可以进一步简化它:

bash在其鲜为人知的功能中具有${var?errormsg}参数扩展。它基本上意味着“如果定义var,则扩展为其值;否则,打印errormsg,设置$?非零并跳到下一个命令”。 errormsg是可选的,默认为parameter null or not set(但需要?)。与常见的参数扩展一样,如果变量的值为空,可以使用冒号(${var:?errormsg})修改它也会出错。

在非交互式shell中,这种参数扩展产生的错误将中止shellcript。

第2版

is_defined() {
  : ${!1:?"parameter $1 null or unset"}
}

刚才在我的MinGW bash上测试过。 :命令只是忽略其所有输入,什么都不做,并返回成功。 (这确实会产生令人讨厌的副作用,即通过在sh: !1:前面添加前缀来污染您的错误消息;请按照自己的意愿使用。)