「cmp」コマンドを使ってファイルの内容を比較して、同じかどうかで異なる処理を行うシェルスクリプトを紹介します。
cmpコマンドについて
cmpはファイルの内容を比較して、最初に差異があった箇所を表示してくれます。
シェルスクリプトで「cmp」を使用してファイルの比較を行うメリットは下記の通りです。
- 最初に違いが見つかった時点で処理を終了するため高速に動作
- バイナリファイルの比較も出来る
- 「-s」オプションでファイルが同じかどうか終了値で確認可能
「-s」オプションを使用した場合、比較結果を下記の終了値として返してくれて、その他にメッセージ等は表示されないので、スクリプトで使用するのにとても都合が良いです。
- 0: ファイル内容が同じ
- 1: ファイル内容が異なる
- 2: ファイルが読み込めなった場合等
シェルスクリプト例
ここで紹介しているシェルスクリプトでは、「-s」オプションを使用してファイルを比較した結果の終了ステータスで処理を分岐させています。
分岐処理を「if文」で行う例と、「case文」で行う例を紹介していきます。
if文での分岐例
「FILE_1」と「FILE_2」に設定してある2つのファイルを比較し、差異がある場合と無い場合の動作をif文を使って分岐させるシェルスクリプト例です。
比較対象のファイルが同じ内容であれば終了値($?)が「0」となるので「OK」と表示され、それ以外は「NG」とされます。
#!/bin/bash FILE_1="Hello_01.txt" FILE_2="Hello_02.txt" cmp -s "$FILE_1" "$FILE_2" if [ $? -eq 0 ]; then echo "OK" else echo "NG" fi exit 0
比較対象として設定してある「Hello_01.txt」と「Hello_02.txt」の内容が同じ場合、終了値が「0」なので下記のように「OK」と表示されます。
$ bash -x ./file_check_if.sh + FILE_1=Hello_01.txt + FILE_2=Hello_02.txt + cmp -s Hello_01.txt Hello_02.txt + '[' 0 -eq 0 ']' + echo OK OK + exit 0
「Hello_01.txt」と「Hello_03.txt」の内容に差異がある場合、終了値が「1」なので下記のように「NG」と表示されます。
$ bash -x ./file_check_if.sh + FILE_1=Hello_01.txt + FILE_2=Hello_03.txt + cmp -s Hello_01.txt Hello_03.txt + '[' 1 -eq 0 ']' + echo NG NG + exit 0
パーミッションの設定で「root」以外は読み込みの出来ない、「Hello_04.txt」ファイルとの比較を行ってみます。
$ ls -lh Hello_04.txt -rw------- 1 root root 32 Feb 14 18:54 Hello_04.txt
ファイルにアクセスできない場合、終了値として「2」が返ってきますので「NG」と表示されます。
$ bash -x ./file_check_if.sh + FILE_1=Hello_01.txt + FILE_2=Hello_04.txt + cmp -s Hello_01.txt Hello_04.txt + '[' 2 -eq 0 ']' + echo NG NG + exit 0
case文での分岐例
終了ステータス毎に異なる処理を行いたい場合はcase文を使用します。
ファイルの内容が同じ場合は「OK」、差異があった場合は「NG」、ファイルが読み込めない場合などは「Error」と表示します。
#!/bin/bash FILE_1="Hello_01.txt" FILE_2="Hello_02.txt" cmp -s "$FILE_1" "$FILE_2" case "$?" in 0 ) echo "OK" ;; 1 ) echo "NG" ;; 2 ) echo "Error" ;; esac exit 0
「Hello_01.txt」と「Hello_02.txt」の内容が同じ場合、終了値が「0」なので下記のように「OK」と表示されます。
$ bash -x ./file_check_case.sh + FILE_1=Hello_01.txt + FILE_2=Hello_02.txt + cmp -s Hello_01.txt Hello_02.txt + case "$?" in + echo OK OK + exit 0
「Hello_01.txt」と「Hello_03.txt」の内容に差異がある場合、終了値が「1」なので下記のように「NG」と表示されます。
$ bash -x ./file_check_case.sh + FILE_1=Hello_01.txt + FILE_2=Hello_03.txt + cmp -s Hello_01.txt Hello_03.txt + case "$?" in + echo NG NG + exit 0
「Hello_04.txt」はパーミッションの設定で「root」以外は読み込みの出来ないファイルとなっています。
$ ls -lh Hello_04.txt -rw------- 1 root root 32 Feb 14 18:54 Hello_04.txt
「Hello_04.txt」が読み込めない場合、終了値が「2」なので下記のように「Error」と表示されます。
$ bash -x ./file_check_case.sh + FILE_1=Hello_01.txt + FILE_2=Hello_04.txt + cmp -s Hello_01.txt Hello_04.txt + case "$?" in + echo Error Error + exit 0
コメント