我使用以下代码来验证变量是否不为空并且效果很好
VAR=(var1 var2 var3)
chec_var() {
for item in "${@}"; do
if [ -z "${!item}" ]; then
returncode=1
break
else
returncode=0
fi
done
}
all_vars() {
if chec_var "${VAR[@]}"; then
if [[ ${returncode} -gt 0 ]]; then
echo "error"
exit 1
else
echo "OK"
fi
fi
}
all_vars
当我在脚本末尾添加 set -Euo pipelinefail 时,问题就出现了。
比当变量之一不存在时,我收到以下错误:
/script line number: !item unbound variable
但它应该显示“echo error”而不是来自 pipelinefail 的消息
另一次,当所有变量都存在时,它只检查第一个变量并显示
“echo OK”,
而不是遍历循环并检查所有变量
问题:
我在这里做错了什么?
如何循环遍历所有变量,并在启用 -Euo pipelinefail 时检查所有变量以显示“OK”?
使用 pipelinefail 修改后的脚本如下所示:
VAR=(var1 var2 var3)
chec_var() {
for item in "${@}"; do
if [ -z "${!item}" ]; then
return 1
break
else
return 0
fi
done
}
all_vars() {
if chec_var "${VAR[@]}"; then
if [[ ${returncode} -gt 0 ]]; then
echo "error"
exit 1
else
echo "OK"
fi
fi
}
set -Euo pipefail
all_vars
答案1
这是在 bash 中执行此操作的一种方法:
if declare -p variable >&/dev/null ; then
echo "variable exists"
else
echo "variable does not exist"
if
declare -p
如果变量存在,则返回退出代码 0,如果不存在,则返回退出代码 1。 stdout和stderr的重定向是因为我们不想看到任何输出,我们只想测试变量是否存在。
但在大多数情况下,仅测试变量是否为空(即[ -z "$variable" ]
,使用 反转非空测试[ -n "$variable" ]
)就足够了。