この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
シェルスクリプトにはブール値はありません。
これの最良のシミュレーションは整数値です。
たとえば、0
fortrue
と1
forです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
その値に置き換えられます。 - これで、サブシェルが実行を試みます
r2g_multi_temp
。 - 奇跡的に値が有効なbashコマンドの場合は、2つのシナリオがあります。
- コマンドは正常に実行されて保存
stdout
されましたr2g_multi
。 - コマンドが失敗し、サブシェルが呼び出されました
r2g_multi_temp
。
再び似た話です。有効なコマンドであれば実行されますstdout
。追加stdout
の値に基づいてコマンドを実行でき、r2g_keep_temp
すべてがに保存されますr2g_multi
。
- コマンドは正常に実行されて保存
みんなこの場所から逃げましょう:D