web-dev-qa-db-ja.com

bash関数の戻り値をテストする適切な方法は何ですか?

次のようなifステートメントでbash関数の戻り値をテストしたいと思います。

if [[ func arg ]] ; then …

しかし、次のようなエラーメッセージが表示されます。条件付き二項演算子が必要です。

これを行う正しい方法は何ですか?

それは...ですか:

 if [[ $(func arg) ]] ; then ...
51
grok12

結果ではなく終了コードである場合は、単に使用できます

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 'リストが実行されます(存在する場合)。コンストラクト全体の終了ステータスは、最後に実行されたコマンドの終了ステータスです。真のテスト条件がない場合はゼロです。

終了ステータス:最後に実行されたコマンドのステータスを返します。

66
kay

このエラーは、関数が複数の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" ]]
16
Alex Gitelman

これは私にとって便利だったので、次の詳細を追加します。

2つの条件をテストする必要がある場合、1つは関数/コマンドの終了ステータスで、もう1つは変数の値はこれを使用します:

if func arg && [[ $foo -eq 1 ]]; then echo TRUE; else echo FALSE; fi
15
Pedro Inácio