我有这个 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
对于true
和1
对于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");
不是你想要的东西。
- 首先变量
r2g_multi_temp
和r2g_keep_temp
将被它们的值替换。 - 现在子 shell 将尝试执行
r2g_multi_temp
. - 如果奇迹般地该值是有效的 bash 命令,则有两种情况:
- 该命令已成功执行,并将其
stdout
保存在r2g_multi
. - 该命令失败,子 shell 调用了
r2g_multi_temp
.
再次类似的故事,如果它是一个有效的命令,它将被执行,并且它stdout
会被执行附加的stdout
根据 的值执行命令的可能性r2g_keep_temp
,并且所有内容都将存储在 中r2g_multi
。
- 该命令已成功执行,并将其
总而言之,逃离这个:D