以下の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
エラーも印刷されることです。これが望ましくない場合は、コードを調整する必要があります。$technology
IP
AN_EUD