Bash 检查变量是否在设置“set -u”时使用 -z 设置?

Bash 检查变量是否在设置“set -u”时使用 -z 设置?
#!/usr/bin/env bash
set -euo pipefail


if [ -z "$BUILD_DATE" ]; then
  export BUILD_DATE="$(date +%s%N)"
  echo "???"
else 
  echo "!!!!!!!"
fi

上面没有输出任何内容,因为它遇到了错误:env/local-testing.sh:22: BUILD_DATE: parameter not set

set +u除了运行并set -u再次围绕这个条件之外,还有其他选择吗?

答案1

如果你正在运行set -u并且有一个变量可能未设置,并且您需要测试它是否为空-z,然后您可以使用

if [ -z "${BUILD_DATE:-}" ]; then

"${BUILD_DATE:-}"展开为空字符串如果BUILD_DATE变量为空或未设置。

答案2

使用默认的空值:

if [ -z "${BUILD_DATE-}" ]; then

参数扩展man bash。使用 just-意味着当变量未设置时使用空值。

答案3

参数扩展版本很好,但(对我来说)很难记住。在 Raspbian Buster (Debian) 上的 bash 5.0.3(1) 中使用 -v 进行测试对我来说效果很好。

#!/bin/bash
set -euo pipefail
a=1
if [[ -v a ]]; then echo "a is set with value $a"; else echo "a is not set"; fi
unset a
if [[ -v a ]]; then echo "a is set with value $a"; else echo "a is not set"; fi
echo "ends"

输出

a is set with value 1
a is not set
ends

希望这可以帮助。

相关内容