GNU/Linux >> Linux の 問題 >  >> Linux

5 Bash Case ステートメントの例

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 のコマンド ラインとシェル スクリプトを制御するのに役立ちます。


Linux
  1. Bashでのケースステートメントの使用

  2. 6 Bash 条件式の例 ( -e, -eq, -z, !=, [, [[ ..)

  3. 4 Bash If ステートメントの例 ( If then fi, If then else fi, If elif else fi, Nested if )

  1. 例を含む Bash If-Else ステートメント

  2. 4 Awk If ステートメントの例 ( if, if else, if else if, :? )

  3. Bash for ループの例

  1. 例を使用してBashスクリプトを作成する方法

  2. Bash/sh 'if else' ステートメント

  3. bashにgotoステートメントはありますか?