シェルスクリプトの行末にセミコロンが不要ですか?


103

以下を含むシェルスクリプトがあります。

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

上記のスニペットではセミコロンは完全に不要ですか?また、一部の人々がダブルセミコロンを使用する理由はありますか?

セミコロンは区切り文字にすぎないようです。改行の代わりに使用します。

回答:


150

改行はコマンドの区切り文字でもあるため、行の終わりにある単一のセミコロンは不要です。case具体的には、各パターンブロックの最後のコマンドの最後にセミコロンが2つ必要です。詳細help caseについては、を参照してください。


20
すごい!だから、私があなたを正しく理解していれば、行末のシングルセミコロンを安全に削除できますが、ダブルセミコロンは絶対に削除できませんか?
Nagel

29

によるとman bash

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

したがって、は;メタキャラクタまたは制御演算子にすることができますが、;;は常に制御演算子です(コマンドの場合)。

特定のコードで;は、行末のすべては必要ありません。;;しかし、必要とされています。


4
間の実用的な違いは何だ;;;、その後は、?BASHが「メタ文字」と呼ぶものと「制御演算子」と呼ぶものとの実際的な違いを知るには、BASH構文解析に慣れていません。
jvriesem

1
jvriesemの質問とコメントに同意すると、ドキュメントスニペットが少し狭すぎるように見えます
grgry

6

findの特殊なケースでは、;-execによって呼び出されたコマンドを終了するために使用されます。この質問に対する @kenorbの回答を参照してください。


0

@ Opensourcebook-Amit

;端末またはシェルスクリプトの単一のセミコロンに相当する改行 。

以下の例を参照してください。

端末上:

[root@server test]# ls;pwd;

シェルスクリプト:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

しかし&、改行または単一のセミコロンに相当するコメントには同意しません

& バックグラウンドでコマンドを実行することもできますが、コマンドセパレータはセミコロンや改行としては機能しません。


-2

@Ignacio Vazquez-Abrams

実際、これは完全に正確ではありません。行の終わりにある単一のセミコロン余分ではなく、新しい行とはまったく同じものではありません。

バッシュリファレンスマニュアル

「;」で区切られたコマンド 順次実行されます。シェルは、各コマンドが順番に終了するのを待ちます。戻りステータスは、最後に実行されたコマンドの終了ステータスです。

「改行」で区切られたコマンド かもしれないコマンドは、セミコロンで区切られたときに並列に実行されているが、常に順番に実行します


5
これは誤りです。違いはありません。マニュアルの同じセクションを適切に読んだ場合、上記の数行だけA sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.が表示されます。セミコロンについて引用した内容は、改行にも同様に適用されます。
underscore_d

1
この文があいまいであることに同意します。著者が意味したのは「;」だと思います。および「\ n」は、コマンドを分離するために2回以上使用できますが、同じことをしているわけではありません。私はこのリンクを見つけました:unix.stackexchange.com/questions/53390/… また、私が書いたいくつかのスクリプトで実際に問題が発生し、 ";"の違いについて言及される前に、これを知りませんでした。と "\ n"私の同僚の一人。残念ながら、これはずっと前のことであり、ここに例を投稿することが何であったか思い出せません。
IJ

2
@IJにリンクした投稿を読むと、並列性は。からでは&ないことがわかります\n。コメントには、セミコロンをスキップできると記載されています。これは、明らかに、およびと&同様にコマンドの区切り文字でもあるためです。;\n
Matthias
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.