
次の操作を実行するための簡単な 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