如何使用 bash 测试环境变量的有效性,检查它是否存在以及是否为真?

如何使用 bash 测试环境变量的有效性,检查它是否存在以及是否为真?

我正在寻找一个测试,如果环境变量被定义并且具有不同于、或 的true值,则返回。0falseNULL

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

注意:在任何情况下,bash 都不应抱怨变量未定义或具有奇怪的值,除 0、空、false 或未定义之外的任何其他值都将被视为真。

答案1

这种测试并不像 Java 或 C# 等高级语言中那样存在,但构建起来相对容易。

针对您的问题提出三条评论:

1:在 bash 中,不能使用文字“真”/“假”值;所有命令和条件构造都会产生退出状态, 或者逻辑结果,要么是 0(真),要么是非 0(假)。
利用这一点,不要重新发明轮子。

2:尽量不要使用大写的参数名称,除非它们是环境变量;这是一个有助于保持代码清洁的简单惯例。

3:您所说的“NULL”到底是什么意思?文字字符串无效的、空值,还是其他什么?
后两个概念在 bash 中不存在;无效的变量将被取消设置,您已经对此进行了检查。

最有效的解决方案是一个接受变量(或参数,bash 称之为)的函数,并检查这些条件,然后根据该条件设置退出状态,有效地将多个真值压缩为文字 0 或 1。

例如:

is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }

  • is_true "1"结果是 0,这是真的
  • is_true "false"结果为 1,为假
  • a=10; is_true "$a"收益为 0
  • grep -q something somefilesomething如果在中至少出现一次,则结果为 0 somefile

请注意,后一个例子清楚地表明你不需要这样的构造;bash 中发生的一切已经使用这些基本的 0/1 真值。

但我承认你可能必须转换来自一些复杂的外部程序的输入:)

答案2

我发现这些比较毫无用处,因为它们使代码看起来晦涩难懂。我只是使用 bash 的优秀功能(自 v4.2 开始),来自手册页:

   -v varname
          True if the shell variable varname is set (has been assigned a value).

使用非常简单

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
fi

换句话说,要标记为已启用,只需定义即可。试试看!

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"

答案3

您可以使用正则表达式匹配进行所有三项检查(未定义的参数解析为空字符串):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)

相关内容