我正在寻找一个测试,如果环境变量被定义并且具有不同于、或 的true
值,则返回。0
false
NULL
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"
收益为 0grep -q something somefile
something
如果在中至少出现一次,则结果为 0somefile
。
请注意,后一个例子清楚地表明你不需要这样的构造;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|)$ ]]
)