【问题标题】:Variable set with `elif [[ -n ${var=$(mycommand ...args...)} ]]` unexpectedly empty使用 `elif [[ -n ${var=$(mycommand ...args...)} ]]` 设置的变量意外为空
【发布时间】:2023-01-24 00:27:22
【问题描述】:

我不确定这是否是在 elif 语句中定义变量的好方法。

我想将 VALUE 设置为 CUSTOM_KEY 的值,如果它包含其他内容,则从 configmap 获取值。

似乎有时在第二个 elif 语句中运行命令可能需要几秒钟,我不确定它是否会影响命令的结果。

if [[ -n "${CUSTOM_KEY}" ]]; then

    VALUE="${CUSTOM_KEY}"

    echo "VALUE: ${VALUE} set from CUSTOM_KEY"

elif [[ -n "${VALUE="$(kubectl get configmap configmapvalue -n "${N}" -o jsonpath="{.data.VALUE}")"}" ]]; then

     echo "VALUE: ${VALUE} set from configmap configmapvalue"

else

     echo "Please, define a CUSTOM_VALUE"

fi

echo "${VALUE}"

【问题讨论】:

  • 这里唯一可能需要几秒钟的是kubectl get。这不是 bash if 语句的问题,而是 kubectl 的问题——我不知道您希望我们对此做些什么。
  • 这是正确的。 kubectl get 可能需要几秒钟,我不确定这是否是我在 VALUE 中得到空字符串的原因。
  • 怎么办一个问题是试图用错误的语法进行赋值。跟延迟没有关系。
  • 注意${var=value}${var:=value}不一样,因为前者只修改一个未设置的变量。一个变量设置为空值仍然设置。
  • 我已经检查了kubectl get .. 是否向VALUE分配了一些东西,如果我运行echo "$(kubectl get configmap configmapvalue -n "${N}" -o jsonpath="{.data.VALUE}")"}"我可以看到这个值,但是在管道中运行代码它没有得到任何值。

标签: linux bash shell if-statement


【解决方案1】:

直接的问题是 ${var=value} 只分配给 var当变量先前未设置时.

我们不知道它是否未设置,因为 [ -n "$var" ] 仅在它未设置时进行测试空的.变量可以设置为空值,在这种情况下${var=default} 不会更改它,但${var:=default} 会。


你不需要使用${var=default}或者${var:=default},但是,因为如果完全执行 elif 子句,您知道您需要从 kubectl 更新值。因此:

elif VALUE=$(kubectl get configmap configmapvalue -n "$N" -o jsonpath='{.data.VALUE}') && [[ $VALUE ]]; then

【讨论】:

  • 最后一个 && [[ $VALUE ]] 不是 && [[ -n $VALUE ]] 吗?
  • @Shefferdock,它们 100% 相同,因此没有理由使用更长的形式。
  • 甚至 [ "$VALUE" ] 也能保证具有我们想要的语义;请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html,并查找描述“1 个参数”案例的位置。 (这里的 [[[ 给我们带来了省略引号的能力)。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2012-08-29
  • 2022-07-06
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多