0

我正在编写一个 bash 脚本来自动化一些系统管理员的工作。我首先检查是否定义了许多变量。我现在这样做的方式是这样的:

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

is_defined "PROJECTNAME" $PROJECTNAME

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

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

4

2 回答 2

2

像这样的东西:

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

${!a} 正如@sehe 所说,将打印变量的值,名称为 $1

于 2013-04-19T08:59:34.707 回答
2

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

版本 1

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

但我们可以进一步简化:

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

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

版本 2

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

刚刚在我的 MinGW bash 上进行了测试。该:命令只是忽略其所有输入,不执行任何操作并返回成功。(这确实有令人讨厌的副作用,即通过在错误消息前加上sh: !1:; 来污染您的错误消息,随意使用。)

于 2013-04-19T09:08:56.850 回答