同じ if/then bash スクリプト ステートメントで文字列の一致と空のファイルを確認するにはどうすればよいでしょうか?

同じ if/then bash スクリプト ステートメントで文字列の一致と空のファイルを確認するにはどうすればよいでしょうか?

次の操作を実行するための簡単な bash スクリプトを書いています。

1) 2 つのファイル (foo1 と foo2) を確認します。

2) foo1 が foo2 と異なり、foo1 が空白でない場合は、電子メールを送信します。

3) foo1 が foo2 と同じか、foo1 が空白の場合は何もしません。

空白の条件が私を混乱させています。まず、次の点について考えてみましょう。

diff --brief <(sort ./foo1) <(sort ./foo2) >/dev/null
comp_value=$?

if [ $comp_value -ne 0 ]
then
        mail -s "Alert" [email protected] <./alertfoo

fi

明らかに、これは空白の内容をチェックしません。それを実行する方法について何か考えはありますか?

答え1

テストの-s演算子を使用して、ファイルが空かどうかを確認できます。これは、cmp一般的に、ファイルの等価性を確認する最も簡単な方法です (if終了ステータスを 0 と比較するより簡単な方法として、ステートメント内でコマンドを直接使用できることに注意してください)。比較する前に 2 つのファイルを並べ替える部分はそのままにしておきます。それが必要ない場合は、 の引数として 2 つのファイルを直接使用してくださいcmp

if [ -s ./foo1 ] && ! cmp -q <(sort ./foo1) <(sort ./foo2); then
    ...

上記は、「./foo1 が空でない場合 ( [ -s ... ]) かつ ( &&) ./foo1 と ./foo2 のソートされた形式が!同じではない ( )場合 ( cmp)」と解釈できます。

答え2

-s を使用すると、ファイルが空かどうかを確認できます。

if [[ -s $FILE ]] ; then
echo "$FILE has data."
else
echo "$FILE is empty."
fi

文字列が空かどうかを知りたい場合は、オプション -z を使用して空かどうかを確認します。

STRING="test"
if [[ -n "$STRING" ]]; then
    echo "String is not empty"
fi

または -n で空でないかどうかを確認します:

STRING=""
if [[ -z "$STRING" ]]; then
    echo "String is empty"
fi

関連情報