Shell-Script

如何在 zsh if 語句中檢查命令的輸出結果與無輸出?

  • May 24, 2020

我想比較 2 個文件diff,然後如果它什麼都不返回,則echo "no diff"顯示差異。我目前的 if 語句僅在沒有區別的情況下才有效,但如果有,那麼它會給我一個“未找到”錯誤。

這就是 test.sh 的樣子:

#!/bin/zsh
if [$(diff file1 file2) = '']
then
   echo "no diff"
else
   diff file1 file2
fi

如果文件相同:

$ sh test.sh
no diff

如果文件不同:

$ cat file1
hello

$ cat file2
goodbye

$ sh test.sh
test.sh: 1: test.sh: [1,8c1,8: not found
< hello
---
> goodbye

在我尋找解決方案的過程中,我發現有空格if [ $(diffvs 有所作為if [$(diff,使用單個=vs==也有幫助。我認為問題一定是我正在測試輸出''(什麼都沒有)。它確實有效,但“未找到”行不屬於那裡。我不只是想讓那條煩人的行保持沉默,而是以正確的方式執行 if 語句,因為應該有一種方法可以獲得我需要的結果,而不必執行diff兩次。

diff如果沒有發現差異,則提供零退出狀態,因此只需使用diff一次並在需要時輸出消息:

if diff file1 file2; then
   echo 'no diff'
fi

  • diff實用程序可能有選項-s/ --report-identical-files(對 POSIX 規範的擴展)。這會將命令簡化為:
diff -s file1 file2
  • 錯誤的原因[1,8c1,8: not found是語法錯誤:[需要單獨出現,並帶有一個有效的表達式和一個結束]參數。有關如何使用的資訊test可以在 unix.stackexchange (連結 連結 連結)和手冊頁中man 1 test找到man 1p test
  • test.sh中,第一行是#!/bin/zsh,但隨後腳本正在使用sh解釋器執行(可能不是zsh)。如果您確實想使用zsh功能,那麼您需要確保您實際上正在執行腳本zsh

引用自:https://unix.stackexchange.com/questions/588591