从测试表达式中获取布尔值

从测试表达式中获取布尔值

我有这个 bash 代码:

   local r2g_keep_temp=$(r2g_match_arg "--keep" "${my_args[@]}");
   local r2g_multi_temp=$(r2g_match_arg "--multi" "${my_args[@]}");

   local r2g_multi=[ "$r2g_multi_temp" || "$r2g_keep_temp" ];

如果定义了 $r2g_multi_temp 或 $r2g_keep_temp ,我只希望 r2g_multi 代表一个布尔值。我怎样才能做到这一点?上面的内容在语法上是无效的。

另一方面,这在语法上是有效的,但不确定它是否正确:

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");

答案1

shell 脚本中没有布尔值。

对它们的最佳模拟是整数值。
例如,0对于true1对于false

[[ -v variable_name ]]将返回1,如果variable_name 不是定义或者0如果它曾是

因此,您可以通过以下方式获得您想要的行为:

// If one of the variables is defined, return value of this command is 0.
[[ -v r2g_keep_temp ]] || [[ -v r2g_multi_temp ]]

// Save the return value of the last command (0 or 1).
local r2g_multi="$?"

当然,你可以随心所欲地解释这些数字,我只是想演示一个例子。


顺便一提,

local r2g_multi=$("$r2g_multi_temp" || "$r2g_keep_temp");

不是你想要的东西。

  1. 首先变量r2g_multi_tempr2g_keep_temp将被它们的值替换。
  2. 现在子 shell 将尝试执行r2g_multi_temp.
  3. 如果奇迹般地该值是有效的 bash 命令,则有两种情况:
    • 该命令已成功执行,并将其stdout保存在r2g_multi.
    • 该命令失败,子 shell 调用了r2g_multi_temp.
      再次类似的故事,如果它是一个有效的命令,它将被执行,并且它stdout会被执行附加的stdout根据 的值执行命令的可能性r2g_keep_temp,并且所有内容都将存储在 中r2g_multi

总而言之,逃离这个:D

相关内容