如何在同一個 if/then bash 腳本語句中檢查字串符合和空檔?

如何在同一個 if/then bash 腳本語句中檢查字串符合和空檔?

我正在編寫一個簡單的 bash 腳本來執行以下操作:

1)檢查兩個檔案(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 進行比較的更簡單的替代方案)。我保留了在比較兩個文件之前對它們進行排序的位元;如果不需要,只需直接使用這兩個文件作為cmp.

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

您可以將上面的內容讀作:「如果 ./foo1 不為空 ( [ -s ... ]) AND ( &&) ./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

相關內容