这个 bash 片段有什么作用?

gai*_*jin 0 bash

我不太精通 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
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Kus*_*nda 5

-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
Run Code Online (Sandbox Code Playgroud)

请注意插入的-n测试运算符,它测试非空字符串。当您仅测试字符串时,此运算符是隐式的。

目前尚不清楚是否DISABLE_CUSTOM_CREDS需要对非空进行初始测试(我们看不到其余的代码)。如果变量有可能为空,则可能需要它,在这种情况下,零测试将为(并且程序员可能不希望它触发设置ENABLE_CREDS1)。

这意味着

  • ENABLE_CREDS设置为1ENABLE_CREDS需要未设置或为空字符串,DISABLE_CUSTOM_CREDS必须非空且数值等于零,
  • ENABLE_CREDS设置为0ENABLE_CREDS必须未设置或为空,并且DISABLE_CUSTOM_CREDS在数值上必须等于 1。

在不了解此代码的更多上下文的情况下,我可能会大胆猜测if整个语句的目的是设置ENABLE_CREDS01尚未设置为某个值,具体取决于变量的逻辑逆DISABLE_CUSTOM_CREDS

if [ -z "$ENABLE_CREDS" ]; then
    if [ "${DISABLE_CUSTOM_CREDS:-0}" = 1 ]; then
        ENABLE_CREDS=0
    else
        ENABLE_CREDS=1
   fi
fi
Run Code Online (Sandbox Code Playgroud)

如果ENABLE_CREDS为空,则针对 进行测试DISABLE_CUSTOM_CREDS(或字符串0,如果变量未设置或为空)1,并根据该测试的结果设置ENABLE_CREDS0或。1

这里的区别在于,这段代码总是留下ENABLE_CRED一些。它要么具有旧的非空值,要么保证具有值01

这与问题中的代码形成对比,如果DISABLE_CUSTOM_CREDS为空或者它是某个值2(或者实际上如果它是值不为 0 或 1 的某个其他变量的名称;算术),则可能会将变量的值保留为空评估很棘手,这就是我在上面的代码中选择字符串比较的部分原因)。

  • @ilkkachu 是的。不幸的是,当没有给出更多代码时,很难猜测其意图,但当前代码很可能没有“完全”执行所有情况下的预期操作。 (2认同)