シェルにネストされたif elseステートメント

シェルにネストされたif elseステートメント

以下のif elseステートメントにどのような問題があるのか​​理解できません。

if [ "$technology" == "AN_EUD" ] then
        if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "node" ]
        then
                parm="DEVICEID"
        elif [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "trunk" ]
        then
                parm="DEVICEID"
        else echo "Unkown parameter"
        fi
else [ "$technology" == "IP" ] then
        if [ "$temporal_unit" == "15min" ] && [ "$regional_unit" == "item" ]
        then
                parm="ME_NAME"
        elif [ "$temporal_unit" == "min" ] && [ "$regional_unit" == "item" ]
        then
                parm="DEST"
        else echo "Unknown parameter"
        fi
fi

継続的にエラー未満

my.sh: line 67: syntax error near unexpected token `else'
my.sh: line 67: ` else [ "$technology" == "IP" ] then'

ベストアンサー1

if [ "$technology" == "AN_EUD" ] then
                                ^

そこにセミコロンが抜けましたね。作成された方法は、シェルキーワードではなくコマンドの一般的な引数thenです。[(再び、これはコマンドのキーワードではありませんecho if then else fi。)

Bashは後者がelseまだ探しているので予期しないトークンであり、コマンドの先頭にあるthenので文句を言います。elseはいキーワードで識別されます。しかし、文法的ではありません。

Shellcheck.netまた、「'then'の前にセミコロンや改行文字を使用してください(またはリテラルにするには引用符を使用してください)」とされています。

修理後の様子はこんな感じです。

else [ "$technology" == "IP" ] then

そうですelifが、そうではありませんelse。前にセミコロンがない場合は、シェル構文に関する限りこれは実際には大丈夫ですthen。コマンド[ "$technology" == "IP" ] then はelseブロックの一部にすぎません。テストでは最後の引数が[表示されると予想されます]が、ブロックの残りの部分は実行されるため機能しません。セミコロンを追加してそのままにすると、else「予期しないキーワード」エラーが発生しますthen

テストのもう一つの問題は、==Bashとkshでは動作しますが、標準ではないということです。標準比較演算子[ .. ]はです=

(私はあなたが実際に何をしているのかを見ずに構文とエラーだけを見ていることに注意してください。)

おすすめ記事