【Shell】case文を使ってパターンマッチ処理をする

■case文

case文は1つの文字列に対して、複数のパターンを指定し、それぞれのパターンにマッチした処理をする構文である。

▼case文の書き方

case 文字列 in
    パターン1)
        パターン1にマッチした時に実施する処理
        ;;
    パターン2)
        パターン2にマッチした時に実施する処理
        ;;
    パターン3)
        パターン3にマッチした時に実施する処理
        ;;

    ...
    
    *)
        どのパターンにもマッチしなかった時に実施する処理
        ;;
esac

・上記の「文字列」に対して、それぞれのパターンにマッチしているか、上から順に判定している。
・上から順に判定しているため、最初にマッチしたパターンの処理を実行する。
・セミコロン「;」を2つ書くことで、その処理を終了判定とする。
・パターンにワイルドカード「*)」を使用することで、どのパターンにもマッチしなかった場合の処理を行うことができる。なお、ワイルドカード「*)」を指定しないと、マッチしなかったとき、何も実行されない。
・case文の最後にはesacをつける。

■入力した数字(文字列)で判定処理

▼処理概要

シェルファイルを実行したときの第1引数を取得し、以下の判定処理を行う。
1の場合:
 「1が入力されました。」と出力
2の場合:
 「2が入力されました。」と出力
1、2以外の場合:
 「1,2以外が入力されました:(第1引数の値)」と出力

▼サンプルコード

#!/bin/bash

# 実行時の第1引数を格納
input_num="$1"

case "$input_num" in
    "1")
        echo "1が入力されました。"
        ;;
    "2")
        echo "2が入力されました。"
        ;;
    *)
        echo "1,2以外が入力されました:$input_num"
        ;;
esac

▼実行結果

①実行コマンド:
./sample.sh 1

1が入力されました。

②実行コマンド:
./sample.sh 2

2が入力されました。

③実行コマンド:
./sample.sh 3

1,2以外が入力されました:3

■入力したファイル名で判定処理

▼処理概要

シェルファイルを実行したときの第1引数を取得し、以下の判定処理を行う。
拡張子がテキスト(*.txt)の場合:
 第1引数に指定したファイル名の先頭1行を表示する。
拡張子がconfもしくはiniの場合:
 第1引数に指定したファイル名の末尾1行を表示する。
上記拡張子以外:
 「入力されたファイル名はサポートしていません」と出力
 「ファイル名:(第1引数の名前)」と出力

▼前提(事前準備)

以下の3ファイルを予め用意。

tmp.txt

▼ファイルの中身

1行目:headコマンドが使用されました
2行目:hoge1
3行目:hoge2
4行目:hoge3
5行目:hoge4

tmp.conf

▼ファイルの中身

1行目:hoge1
2行目:hoge2
3行目:hoge3
4行目:hoge4
5行目:tailコマンドが使用されました(conf)

tmp.ini

▼ファイルの中身

1行目:hoge1
2行目:hoge2
3行目:hoge3
4行目:hoge4
5行目:tailコマンドが使用されました(ini)

▼サンプルコード

#!/bin/bash

# 実行時の第1引数を格納
file_name="$1"

case "$file_name" in
    *.txt)
        head -n 1 "$file_name"
        ;;
    *.conf | *.ini)
        tail -n 1 "$file_name"
        ;;
    *)
        echo "入力されたファイル名はサポートしていません"
        echo "ファイル名:$file_name"
        ;;
esac

▼実行結果

①実行コマンド:
./sample.sh tmp.txt

1行目:headコマンドが使用されました

②実行コマンド:
./sample.sh tmp.conf

5行目:tailコマンドが使用されました(conf)

③実行コマンド:
./sample.sh tmp.ini

5行目:tailコマンドが使用されました(ini)

④実行コマンド:
./sample.sh tmp.sh

入力されたファイル名はサポートしていません
ファイル名:tmp.sh
タイトルとURLをコピーしました