您正在寻找的是间接性。
assertNotEmpty() {
: "${!1:? "$1 is empty, aborting."}"
}
如果您执行以下操作,这会导致脚本中止并显示错误消息:
$ foo=""
$ assertNotEmpty foo
bash: !1: foo is empty, aborting.
如果您只想测试是否foo
为空,而不是中止脚本,请使用 this 而不是函数:
[[ $foo ]]
例如:
until read -p "What is your name? " name && [[ $name ]]; do
echo "You didn't enter your name. Please, try again." >&2
done
另外,请注意空参数和未设置参数之间有一个非常重要的区别。您应该注意不要混淆这些术语!空参数是已设置但仅设置为空字符串的参数。未设置的参数是根本不存在的参数。
前面的示例都测试空参数。如果要测试未设置的参数并认为所有设置的参数都可以,无论它们是否为空,请使用以下命令:
[[ ! $foo && ${foo-_} ]]
在这样的函数中使用它:
assertIsSet() {
[[ ! ${!1} && ${!1-_} ]] && {
echo "$1 is not set, aborting." >&2
exit 1
}
}
仅当您传递的参数名称表示未设置的参数时,才会中止脚本:
$ ( foo="blah"; assertIsSet foo; echo "Still running." )
Still running.
$ ( foo=""; assertIsSet foo; echo "Still running." )
Still running.
$ ( unset foo; assertIsSet foo; echo "Still running." )
foo is not set, aborting.