次のようなifステートメントでbash関数の戻り値をテストしたいと思います。
if [[ func arg ]] ; then …
しかし、次のようなエラーメッセージが表示されます。条件付き二項演算子が必要です。
これを行う正しい方法は何ですか?
それは...ですか:
if [[ $(func arg) ]] ; then ...
結果ではなく終了コードである場合は、単に使用できます
if func arg; then ...
関数が適切な終了コードを返すようにできない場合(return N
)、文字列の結果を使用する必要がある場合は、@ Alex Gitelmanの回答を使用します。
$ help if
:
if: if COMMANDS; then COMMANDS; [ Elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
条件に基づいてコマンドを実行します。
if COMMANDS
リストが実行されます。終了ステータスがゼロの場合、then COMMANDS
リストが実行されます。それ以外の場合、各Elif COMMANDS
リストが順番に実行され、その終了ステータスがゼロの場合、対応するthen COMMANDS
リストが実行され、ifコマンドが完了します。それ以外の場合、 `else COMMANDS 'リストが実行されます(存在する場合)。コンストラクト全体の終了ステータスは、最後に実行されたコマンドの終了ステータスです。真のテスト条件がない場合はゼロです。終了ステータス:最後に実行されたコマンドのステータスを返します。
このエラーは、関数が複数のWordを返す場合に発生するようです。
例えば、 1 2
。
引用してください:
"$(func arg)"
サンプル:
$ if [[ 1 2 ]] ; then echo 1 ; fi
-bash: conditional binary operator expected
-bash: syntax error near `2'
$ if [[ "1 2" ]] ; then echo 1 ; fi
1
0と0以外を比較する場合は
if [[ "$(func arg)" != "0" ]]
これは私にとって便利だったので、次の詳細を追加します。
2つの条件をテストする必要がある場合、1つは関数/コマンドの終了ステータスで、もう1つは変数の値はこれを使用します:
if func arg && [[ $foo -eq 1 ]]; then echo TRUE; else echo FALSE; fi