どの「.err」テキストファイルが空であるかを確認するためにシェルスクリプトを作成しました。一部のファイルには、次のサンプルファイルに示すように、特定の繰り返しフレーズがありますfake_error.err
(意図的に使用されている空白行)。
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
空のファイル以外に削除したいです。これを行うには、次のスクリプトを作成しました。
#!/bin/bash
for file in *error.err; do
if [ ! -s $file ]
then
echo "$file is empty"
rm $file
else
# Get the unique, non-blank lines in the file, sorted and ignoring blank space
lines=$(grep -v "^$" "$file" | sort -bu "$file")
echo $lines
EXPECTED="WARNING: reaching max number of iterations"
echo $EXPECTED
if [ "$lines" = "$EXPECTED" ]
then
# Remove the file that only has iteration warnings
echo "Found reached max iterations!"
rm $file
fi
fi
done
ただし、ファイルで実行されると、このスクリプトの出力は次fake_error.err
のようになります。
WARNING: reaching max number of iterations
WARNING: reaching max number of iterations
ループの2つのステートメントで実行されますが、$echo
ファイル自体は削除されず、"Found reached max iterations!"
文字列も印刷されません。問題はif [ "$lines" = "$EXPECTED" ]
二重括弧を試してみましたが、うまくいかないことです[[ ]]
。==
私はこれら2つの印刷されたステートメントの違いが何であるかわかりません。
2つの変数が同じではないのはなぜですか?