いくつかの条件に応じて、0または1を返す単純な関数をシェルに書きました。関数名をfooとします。
foo(){
...
...
}
ここで、以下のようにif条件でfooを呼び出そうとします。
if ( foo $1 )
...
..
うまくいきます。ただし、次の方法を使用して呼び出すとエラーが発生します。
if [ foo $1 ]
...
...
「単項演算子の予測」エラーが発生するのはなぜですか?
ベストアンサー1
あなたが使用するとき:
if ( foo $1 )
サブシェルfoo $1
で実行し、if
終了状態に応じて動作します。
あなたが使用するとき:
if [ foo $1 ]
シェルを使用しようとしていますtest
。金持ち有効なテスト演算子ではありません。有効なテスト演算子を見つけることができますここ。
あなたの質問と必ずしも関連があるわけではありませんが、特にシェルテスト角かっこ内で常に変数を引用する必要があります。何かが存在する限り、シェルテストは成功します。したがって、有効なテスト演算子を使用しても不要な結果が生じる可能性があります。
$ unset var
$ [ -n $var ] && echo yes
yes
$ [ -n "$var" ] && echo yes
$ [ -n "" ] && echo yes
$ [ -n ] && echo yes
yes
$ [ foo ] && echo yes
yes
$ [ foo bar ] && echo yes
-bash: [: foo: unary operator expected
シェルテストでは、単一の文字列の存在は、2つ以上の文字列が存在し、文字列の1つが有効なテスト演算子である場合はtrueと評価されます。