1

これは、エラーを生成するコードです。

#!/bin/bash
types=([i]=Info [w]=Warning [e]=Error [se]=Severe)

function isValidType
{
    for type in "${!types[@]}"
    do
        if [ $1 == $type ]; then
            return 0
        fi
    done
    return 1
}

if [ isValidType "$msgType" -eq 1 ]; then # <---- error here
    echo "Invalid type."
    exit 0
fi
4

3 に答える 3

3

ifステートメントの構文は次のとおりです。

if <list>; then <list>; [elif <list>; then <list>;]* [else <list>;]? fi

ここで、は、 、、またはで<list>区切られた「パイプライン」の任意のシーケンスです。(パイプラインは、記号で区切られた 1 つ以上の単純なコマンドです。);&&|||

ifステートメントは、最初に に続く を実行し、リターン コードをチェックすることによって評価されます<list>ifこれは、最後に実行された単純なコマンドのリターン コードになります。それに基づいて、<list>以下を実行するかthen(最初のリストが成功した場合)、またはelifテストおよび/またはelse句を続行するかが決定されます。

その構文のどこにも a は[現れませんが、これには正当な理由があります。[実際にはコマンドです。実際、これは; のほぼ同義語ですtest。違いは[、最後の引数が であると主張すること]です。

使用すると便利な場合もあります[(ただし、ほとんどの場合は を使用する方が便利です[[が、それは別の日のエッセイです) が、決して必須ではありません。コマンドが成功したかどうかをテストするだけの場合は、次のようにします。

if isValidType "$msgType"; then
  # it's valid
else
  # it's not valid
fi

うまくいかなかった場合にのみ何かをする必要がある場合は、!特別な形式を使用します。

if ! isValidType "$msgType"; then
  # it's not valid
fi
于 2013-09-28T22:56:19.137 に答える
2

これを変える

if [ isValidType "$msgType" -eq 1 ]; then

isValidType "$msgType"
if [ $? -eq 1 ]; then 

[は、testを受け入れるコマンドであり、設計どおりに機能しません (関数の戻り値の比較)。

于 2013-09-28T22:38:17.067 に答える
-1

関数が true を返すかどうかを確認するには、これを行う適切な方法は次のとおりです。

if [ !isValidType ]; then
       // would throw a flag for any options passed that are invalid
       // error output
fi

これは、isValidType が 1 または 0 の場合に機能します。問題は、配列をチェックしていることにあると思います。

お役に立てれば。

于 2013-09-28T22:55:56.297 に答える