【シェルスクリプト】ファイルの内容を比較して同じかどうかを調べる方法

記事内に広告が含まれています。

「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

コメント

タイトルとURLをコピーしました