我写了一个小函数,如果函数参数的值为空,它就会退出,如果可能的话,我希望也能够打印参数的名称(而不是值!),我的以下实现无法打印参数的名称。
function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${!1} is empty"
exit 1
fi
}
当这样称呼时
exitIfEmpty someKey
应该打印
Exiting because someKey is empty
答案1
传递给函数的只是一个字符串。如果运行func somevar
,传递的是字符串somevar
。如果运行func $somevar
,则传递的是变量 的(分词)值somevar
。变量引用、指针或类似的东西都不是,它们只是字符串。
如果你想通过姓名将变量转化为函数,然后查看价值对于该变量,您需要使用 nameref (Bash 4.3 或更高版本,IIRC)或间接引用${!var}
。${!var}
扩展为其名称存储在 中的变量的值var
。
因此,您只是在脚本中使用了错误的方式,如果您将变量的名称传递给函数,请使用"${!1}"
来获取价值中命名的变量的$1
和 plain"$1"
得到姓名。
例如,这将打印variable bar is empty, exiting
,并退出 shell:
#!/bin/bash
exitIfEmpty() {
if [ -z "${!1}" ]; then
echo "variable $1 is empty, exiting"
exit 1
fi
}
foo=x
unset bar
exitIfEmpty foo
exitIfEmpty bar
答案2
将名称作为第二个参数传递
function exitIfEmpty()
{
if [ -z "$1" ]
then
echo "Exiting because ${2} is empty"
exit 1
fi
}
exitIfEmpty "$someKey" someKey
答案3
echo "Exiting because \$1 is empty"
应该可以解决问题。