0

私はbashスクリプトで関数を書きました。ただし、構文について不平を言っています。私は本当にそれが何であるかを見ることができません..... エラーメッセージは [: missing `]' です

addem() {
            if [ $# -eq 0] || [ $# -gt 2 ]
            then
                    echo -1
            elif [ $# -eq 1 ]
            then
                    echo $[ $1 + $1 ]
            else
                    echo $[ $1 + $2 ]
            fi
    }
4

6 に答える 6

12

最初の の前にスペースが必要です]。つまり:
変更:
if [ $# -eq 0] || [ $# -gt 2 ]
に:
if [ $# -eq 0 ] || [ $# -gt 2 ]

于 2009-06-23T21:42:58.140 に答える
2

indyK1ng: 「$」は次の文字をエスケープするため、「#」はコメントとして扱われません。「$#」は、現在のコンテキストに存在する位置パラメータの数を表す内部変数です。これは、シェルスクリプトへのコマンドライン引数の数と考えることができますが、その配列は組み込みの「set -- [args]」を使用してリセットできます。

Joakim Elofsson: if ステートメントの全体的な構造は正しいです。これらが別の行にリストされていない場合、「then」の前と「fi」の前にのみ必要です。

問題は、「0」と括弧の間のスペースです。Bash では、条件式を区切るために使用される括弧は、式から少なくとも 1 つのスペースで区切る必要があります。

        if [ $# -eq 0] || [ $# -gt 2 ]    # Wrong

        if [ $# -eq 0 ] || [ $# -gt 2 ]    # Correct

さらに、2 つの条件式を組み合わせることができます。オペレーター協会は、すべてがうまくいくようにします。

        if [ $# -eq 0 -a $# -gt 2 ]   # Even Better

私は、式の評価のために二重括弧で提供される拡張機能を好む傾向があります。2 つの評価の組み合わせは、別の演算子で行われることに注意してください。こちらの方が読みやすいと思います。

        if [[ $# -eq 0 || $# -gt 2 ]]   # My preference

スクリプトの後半では、整数の加算に一重括弧を使用することはお勧めしません。一重括弧は式をブール値に評価しています。二重括弧は整数演算に使用されます。

                echo $[ $1 + $1 ]   # Evaluation of an expression

                echo $(( $1 + $1 ))   # Integer math
于 2009-06-23T22:10:15.387 に答える
1

以下に示すように、拡張テスト構成 (BASH) を使用します。文字数を減らし、読みやすさを向上させると思います(少なくともプログラマーにとって)。:-)

addem() { 
        if (( $# == 0 || $# > 2 )) 
        then 
                echo -1 
        elif (( $# == 1 )) 
        then 
                echo (( $1 + $1 )) 
        else 
                echo (( $1 + $2 ))
        fi 
 }
于 2009-11-25T05:39:24.313 に答える
0

括弧を避け、test代わりに次を使用する必要があります。

if test $# -eq 0 || test $# -gt 2
then
    echo -1
elif test $# -eq 1
then
    echo $(( $1 + $1 ))
else
    echo $(( $1 + $2 ))
fi

より良いシェル スタイルを取得すると、より優れたものになります。:)

于 2009-06-23T21:49:19.717 に答える