Bash シェルの case ステートメントは、C の switch ステートメントに似ています。整数や
Case ステートメントはループではなく、コード ブロックを n 回実行しません。代わりに、bash シェルが状態をチェックし、プログラムの流れを制御します。
この記事では、5 つの実用的な例を使用して bash case コマンドを確認します。
bash シェルの case コンストラクトを使用すると、ワイルド カード文字を含む可能性のあるパターンに対して文字列をテストできます。 Bash case ステートメントは、bash if-then-else ステートメントの最も単純な形式です。
bash case ステートメントの構文。
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
以下は、bash の case ステートメントの重要なポイントです:
- Case ステートメントは、最初に式を展開し、各パターンとの照合を試みます。
- 一致が見つかった場合、関連するすべてのステートメントが 2 つのセミコロン (;;) まで実行されます。
- 最初の一致の後、最後に実行されたコマンドの終了ステータスでケースが終了します。
- 一致するものがない場合、ケースの終了ステータスはゼロです。
Bash ケースの例 1. プロセスへのシグナルの送信
次のスクリプトは、シグナル番号とプロセス ID を引数として受け取り、シグナル名を使用して特定のプロセス ID にシグナルを送信します。
このスクリプトは、case ステートメントの使用法を示すためのものです。
$ cat signal.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi case "$1" in 1) echo "Sending SIGHUP signal" kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal" kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal" kill -SIGQUIT $2 ;; 9) echo "Sending SIGKILL signal" kill -SIGKILL $2 ;; *) echo "Signal number $1 is not processed" ;; esac
上記の例では:
- $1 と $2 はそれぞれシグナル番号とプロセス ID です。
- kill コマンドを使用して、対応するシグナルを指定されたプロセス ID に送信します。
- スリープ コマンドを数秒間実行します。
- オプションの最後の比較 *) はデフォルトのケースであり、何にでも一致します。
上記のシェル スクリプトの使用法:sleep コマンドのプロセス ID を見つけ、そのプロセス ID に kill シグナルを送信してプロセスを強制終了します。
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
また、以前の kill 記事 – プロセスを強制終了する 4 つの方法も参照してください。
Bash ケースの例。 2. ファイル内のパターン マッチ
この例では、行数、単語数を出力し、指定されたパターンに一致する行を削除します。
$ cat fileop.sh #!/bin/bash # Check 3 arguments are given # if [ $# -lt 3 ] then echo "Usage : $0 option pattern filename" exit fi # Check the given file is exist # if [ ! -f $3 ] then echo "Filename given \"$3\" doesn't exist" exit fi case "$1" in # Count number of lines matches -i) echo "Number of lines matches with the pattern $2 :" grep -c -i $2 $3 ;; # Count number of words matches -c) echo "Number of words matches with the pattern $2 :" grep -o -i $2 $3 | wc -l ;; # print all the matched lines -p) echo "Lines matches with the pattern $2 :" grep -i $2 $3 ;; # Delete all the lines matches with the pattern -d) echo "After deleting the lines matches with the pattern $2 :" sed -n "/$2/!p" $3 ;; *) echo "Invalid option" ;; esac
上記のスクリプトの実行を以下に示します。
$ cat text Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer. The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms. It is the most popular editor amongst Linux Journal readers.
Bash ケースの正規表現出力。パターン Vim と一致する行を削除した後:
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
また、Bash ~ expansaion および { } 拡張に関する以前の記事も参照してください。
Bash ケースの例 3. 拡張子からファイル タイプを見つける
この例では、ファイル名の拡張子に基づいてファイルの種類 (テキスト、Csource など) を出力します。
$ cat filetype.sh #!/bin/bash for filename in $(ls) do # Take extension available in a filename ext=${filename##*\.} case "$ext" in c) echo "$filename : C source file" ;; o) echo "$filename : Object file" ;; sh) echo "$filename : Shell script" ;; txt) echo "$filename : Text file" ;; *) echo " $filename : Not processed" ;; esac done $ ./filetype.sh a.c : C source file b.c : C source file c1.txt : Text file fileop.sh : Shell script obj.o : Object file text : Not processed t.o : Object file
Bash ケースの例 4. ユーザーに「はい」または「いいえ」でプロンプトを出す
ほとんどのソフトウェア インストールでは、使用許諾契約の際に、ユーザーからの「はい」または「いいえ」の入力を求められます。次のコード スニペットは、ユーザーから「はい」または「いいえ」の入力を取得する方法の 1 つです。
$ cat yorno.sh #!/bin/bash echo -n "Do you agree with this? [yes or no]: " read yno case $yno in [yY] | [yY][Ee][Ss] ) echo "Agreed" ;; [nN] | [n|N][O|o] ) echo "Not agreed, you can't proceed the installation"; exit 1 ;; *) echo "Invalid input" ;; esac $ ./yorno.sh Do you agree with this? [yes or no]: YES Agreed
パイプ文字で区切られた複数のパターンがある場合、関連付けられたステートメントを実行するために、式はそれらのいずれかに一致できます。パターンは、一致が見つかるまで順番にチェックされます。何も見つからない場合、何も起こりません。
また、以前の 15 の bash 配列の例の記事も参照してください。
Bash ケースの例 5. 起動スクリプト
/etc/init.d ディレクトリの起動スクリプトは、case ステートメントを使用してアプリケーションを起動および停止します。
あらゆる種類のパターンを使用できますが、プリミティブの値をテストする場合は常に case ステートメントを使用することをお勧めします。 (つまり、整数または文字)
$ cat startpcapp #!/bin/bash case "$1" in 'start') echo "Starting application" /usr/bin/startpc ;; 'stop') echo "Stopping application" /usr/bin/stoppc ;; 'restart') echo "Usage: $0 [start|stop]" ;; esac $ ./startpcapp start Starting application /usr/bin/startpc started
推奨読書
Bash 101 ハック、Ramesh Natarajan 著 .私はほとんどの時間を Linux 環境に費やしています。だから当然、私は Bash のコマンド ラインとシェル スクリプトの大ファンです。 15 年前、さまざまな種類の *nix に取り組んでいたとき、C シェルと Korn シェルで多くのコードを記述していました。後年、システム管理者として Linux の作業を開始したとき、Bash シェル スクリプトを使用して、考えられるすべてのタスクをほぼ自動化しました。私の Bash での経験に基づいて、Bash コマンド ラインとシェル スクリプトの両方に関する 101 の実用的な例を含む Bash 101 Hacks eBook を作成しました。 Bash の習得を考えている場合は、ぜひこの本を読んでください。Bash のコマンド ラインとシェル スクリプトを制御するのに役立ちます。