15

私の Bash スクリプトには、後のメイン関数の条件に対して 0 または 1 (true または false) を返す関数があります。

function1 () {
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then
        return 1
    else
        return 0
    fi
}

次に、私の主な機能で:

main () {
    for arg in ${@} ; do
        if [ function1 ${arg} ] ; then
            ...
        elif [ ... ] ; then
            ...
        fi
    done
}

ただし、このスクリプトを実行すると、常にエラー メッセージが表示されます。

[: function1: 単項演算子が必要です

どうすればこれを修正できますか?

4

1 に答える 1

33

それがコマンドの構文の[一部であると仮定するというよくある間違いを犯しています。ifそうではない; の構文ifは単純です

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi

command私たちがよく使う s の1 つは[、コマンドのエイリアスですtest。文字列、数値、およびファイルを比較するための単純なコマンドです。引数のかなり狭い組み合わせを受け入れるため、予期される引数を渡さないと、混乱を招き、誤解を招くエラー メッセージが生成される傾向があります。(というか、エラーメッセージは慣れれば十分ですが、慣れないと誤解されやすいです。)

あなたのmain関数では、への呼び出し[が間違っているように見えます。あなたはおそらく意味します

if function "$arg"; then
    ...
elif ... ; then ...

ところで、適切な方法として、常に文字列を引用する必要があります。の代わりに、およびを使用し"$1"ないでください。$1"$arg"$arg

test作成者がシンタックスの一部を作りたくないものの一般的なキッチン シンクとしての歴史的な理由ifは、オリジナルの Bourne シェルのあまり魅力的でないデザインの 1 つです。Bashを使用してzsh、扱いにくい代替手段 (定義[[で使用する bash の二重括弧などfunction1) を提供します。もちろん、POSIXtestは、Bell Labs のオリジナルの作成物よりもはるかに優れています。

追加の明確化として、関数を単純化して

function1 () {
    ! [[ "$1" =~ "^ ...some regexp... $" ]]
}

つまり、テストを実行し、[[その結果コードを逆にします。(「通常の」ケースでは、成功すると 0 が返されますが、文字列が一致しないことを確認しようとしている可能性がありますか?)

于 2012-05-14T15:20:59.483 に答える