使用 set -Euo pipelinefail 时如何验证变量是否存在?

使用 set -Euo pipelinefail 时如何验证变量是否存在?

我使用以下代码来验证变量是否不为空并且效果很好

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" ])就足够了。

相关内容