後でセミコロンが許可されないのはなぜですか?

後でセミコロンが許可されないのはなぜですか?

私はシェルプログラミングに初めて触れ、次のことが許されることを確認しました。

if [ $table = "Session" ]; then
continue; fi

次も同様です。

if [ $table = "Session" ]; then continue; fi

以下は構文エラーを生成しますが:

if [ $table = "Session" ]; then; continue; fi

thenキーワードが他のキーワードと異なる理由は何ですか?

答え1

thenこれはコマンドでもシェル組み込みでもありませんが、実際にはif構文の一部であるためです。からman bash

   if list; then list; [ elif list; then list; ] ... [ else list; ] fi
          The  if  list is executed.  If its exit status is zero, the then
          list is executed.  Otherwise, each  elif  list  is  executed  in
          turn,  and  if  its  exit status is zero, the corresponding then
          list is executed and the command completes.  Otherwise, the else
          list  is executed, if present.  The exit status is the exit sta‐
          tus of the last command executed, or zero if no condition tested
          true.

だからこれ:

if [ $table = "Session" ]; then continue; fi

これは、両方とも独立して実行できるコマンドである[ $table = "Session" ]ために機能します。対話型シェルに貼り付けるだけで構文エラーが発生しないことを確認できます。continuelistif

martin@martin:~$ export table=test
martin@martin:~$ [ $table = "Session" ]
martin@martin:~$ continue
bash: continue: only meaningful in a `for', `while', or `until' loop

一方、thenこれは実際に単独で実行できるコマンドではありません。

martin@martin:~$ then
bash: syntax error near unexpected token `then'

したがって、最初の2つの例では、ifマニュアルページの説明に従って使用しています。

if list; then list; fi

ただし、その後;に1つを追加すると、構文エラーとして扱われます。もちろん、シェル構文は時々非常に混乱しているようです。特に初めて使用する場合にはさらにそうです。スペースが必要で周囲のスペースが必要であるという事実のため、非常に混乱していた記憶があります。しかし、これが実際にコマンドであるか組み込まれたシェルであることがわかったら理解できます。 :)thenbash[][

答え2

コマンドの後にセミコロンを追加する必要があります。[ … ]はそのようなコマンドですcontinue。一方if、、thenおよびfiはコマンドではなく予約語です。

ifコマンドのように見えますが、ほとんど常にコマンドが従うからです。執筆は利用できる

if print_table_value >foo; [ "$(cat foo)" = "Session" ]; then …

これはまた様々な方法で提示することができる。

if
  print_table_value >foo
  [ "$(cat foo)" = "Session" ]
then

条件付きコマンドの一般的な構文は次のとおりです。

もし化合物一覧それから化合物一覧
(エリーフ化合物一覧それから化合物一覧) *   
(その他化合物一覧それから化合物一覧
フィリピン諸島

どこ

  • 改行は単に可読性のためのものです。
  • 化合物一覧;改行または改行文字で終わるコマンドのリスト。
  • (…)オプションの部分を表し、(…)*は0、1、および複数回繰り返すことができる部分を表します。

キーワードはコマンドの先頭でのみ認識されます。

条件付きコマンドはキーワードで終わる必要がありますfi。これは、演算子が他のコマンドが続く場合に従う必要性を排除しません。たとえば、条件文の後に他のコマンドが続く場合は、条件文の間;または改行文字が必要です。このバックグラウンドで実行されると、wait waitが続く必要があります&

関連情報