テスト式からブール値を取得する

テスト式からブール値を取得する

この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

シェルスクリプトにはブール値はありません。

これの最良のシミュレーションは整数値です。
たとえば、0fortrue1forです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. これで、サブシェルが実行を試みますr2g_multi_temp
  3. 奇跡的に値が有効なbashコマンドの場合は、2つのシナリオがあります。
    • コマンドは正常に実行されて保存stdoutされましたr2g_multi
    • コマンドが失敗し、サブシェルが呼び出されましたr2g_multi_temp
      再び似た話です。有効なコマンドであれば実行されますstdout追加stdoutの値に基づいてコマンドを実行でき、r2g_keep_tempすべてがに保存されますr2g_multi

みんなこの場所から逃げましょう:D

おすすめ記事