シェルにネストされた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では動作しますが、標準ではないということです。標準比較演算子[ .. ]はです=

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

答え2

@ilkkachuがコードの問題を詳しく説明しました。、私はそれを宣言することでより簡潔にすることができることを指摘しているだけですcase。ここで、3つの変数は単に一緒に連結され、文字列は既知の大文字と小文字と一致します。

case "$technology:$temporal_unit:$regional_unit" in
  (AN_EUD:15min:node | AN_EUD:15min:trunk)
    parm=DEVICEID;;
  (IP:15min:item)
    parm=ME_NAME;;
  (IP:min:item)
    parm=DEST;;
  (*)
    echo >&2 Unknown parameter;;
esac

パターンが固定されているため、変数のコロンを区切り文字として使用されるコロンと混在させることはできません。

if/ベースの問い合わせの1つの違いは、orでない限りfiエラーも印刷されることです。これが望ましくない場合は、コードを調整する必要があります。$technologyIPAN_EUD

関連情報