我不太精通 bash,但我确实需要理解以下内容的含义以及解释是什么?
该代码不是我的,但我相信来源我对子句中的表达式特别感到困扰if
,两次有什么好处DISABLE_CUSTOM_CREDS
?
if [[ -z "${ENABLE_CREDS}" && "${DISABLE_CUSTOM_CREDS}" && "${DISABLE_CUSTOM_CREDS}" -eq 0 ]]; then
ENABLE_CREDS=1
elif [[ -z "${ENABLE_CREDS}" && "${DISABLE_CUSTOM_CREDS}" -eq 1 ]]; then
ENABLE_CREDS=0
fi
export ENABLE_CREDS
提前致谢!
答案1
-语句if
执行的测试涉及DISABLE_CUSTOM_CREDS
两次测试 shell 变量。第一次使用变量时,它会测试变量的值是否非空。如果是,则测试非空值在数值上是否等于零。
另一种写法代码如下
if [[ -z "${ENABLE_CREDS}" && -n "${DISABLE_CUSTOM_CREDS}" && "${DISABLE_CUSTOM_CREDS}" -eq 0 ]]; then
ENABLE_CREDS=1
elif [[ -z "${ENABLE_CREDS}" && "${DISABLE_CUSTOM_CREDS}" -eq 1 ]]; then
ENABLE_CREDS=0
fi
export ENABLE_CREDS
请注意插入的-n
测试运算符,它测试非空字符串。当您仅测试字符串时,此运算符是隐式的。
DISABLE_CUSTOM_CREDS
目前尚不清楚是否需要对非空进行初始测试(我们看不到其余的代码)。如果变量有可能为空,则可能需要它,在这种情况下,零测试将是真的(程序员可能不希望它触发设置ENABLE_CREDS
)1
。
这意味着
- 要
ENABLE_CREDS
设置为1
,ENABLE_CREDS
需要未设置或为空字符串,DISABLE_CUSTOM_CREDS
必须非空且数值等于零, - 要
ENABLE_CREDS
设置为0
,ENABLE_CREDS
必须未设置或为空,并且DISABLE_CUSTOM_CREDS
在数值上必须等于 1。
if
在不了解此代码的更多上下文的情况下,我可能会大胆猜测整个语句的目的是设置ENABLE_CREDS
为0
或1
尚未设置为某个值,具体取决于变量的逻辑逆DISABLE_CUSTOM_CREDS
。
if [ -z "$ENABLE_CREDS" ]; then
if [ "${DISABLE_CUSTOM_CREDS:-0}" = 1 ]; then
ENABLE_CREDS=0
else
ENABLE_CREDS=1
fi
fi
如果ENABLE_CREDS
为空,则针对 进行测试DISABLE_CUSTOM_CREDS
(或字符串0
,如果变量未设置或为空)1
,并根据该测试的结果设置ENABLE_CREDS
为0
或。1
这里的区别在于这段代码总是ENABLE_CRED
留下一些价值。它要么具有旧的非空值,要么保证具有值0
或1
。
这与问题中的代码形成对比,如果DISABLE_CUSTOM_CREDS
为空或者它是某个值2
(或者实际上如果它是值不为 0 或 1 的某个其他变量的名称;算术),则可能会将变量的值保留为空评估很棘手,这就是我在上面的代码中选择字符串比较的部分原因)。