我正在寻找一个testing,如果环境variables被定义并且具有不同于0 , false或NULL值将返回true 。
ENABLE_SOMETHING=1 # or ENABLE_SOMETHING=true if ... do ...
注意:在任何情况下bash都应该抱怨variables没有被定义或者有一个奇怪的值,除了0,空,假或者没有被定义的东西都被认为是真的。
这样的testing并不像Java或C#这样的高级语言中存在,但它的构造相对容易。
对你的问题提出三点意见:
1:你在bash中不使用字面的“真”/“假”值; 所有的命令和条件结构产生一个退出状态 ,或逻辑结果 ,它是0(真)或非0(假)。
与此工作,不要试图重新发明车轮。
2:尽量不要使用大写参数名称,除非它们是环境variables; 这是一个简单的约定,有助于保持您的代码清洁。
3:“NULL”是什么意思? 文字stringNULL ,一个空值或其他东西?
后两个概念不存在于bash中; 一个NULLvariables将被取消设置,你已经在检查。
最有效的解决scheme是接受variables(或参数,如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" a=10; is_true "$a"产生0 grep -q something somefile在something中至less出现一次时会返回0。 注意后面的例子清楚地表明你不需要这样的构造; 在bash中发生的所有事情已经可以和这些基本的0/1真值一起工作了。
但我会授予你可能必须从一些粗糙的外部程序转换input:)
我发现这些比较是无用的,因为它们使得代码显得不明显。 我从v4.2开始使用bash的一个很好的function:
-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"
您可以使用正则expression式匹配(未定义的参数parsing为空string)执行全部三项检查:
is_true() ( shopt -s nocasematch [[ ! $1 =~ ^(false|0|)$ ]] )