Bash

包含特殊字元的多條語句,使用 if 導致錯誤

  • October 10, 2017

我一直在嘗試編寫一個腳本來檢查是否在特定文件/文件夾中找不到特定內容,然後它應該列印“失敗”。否則它應該列印“成功”。但是,以下腳本會導致多個錯誤。

if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]
then
echo "Failed"
else
echo "Passed"
fi

誰能告訴我為什麼它會導致錯誤,並且無論如何可以消除錯誤並獲得預期的輸出?

更新:我收到以下錯誤:

s.sh: line 1: conditional binary operator expected
s.sh: line 1: expected `)'
s.sh: line 1: syntax error near `'/example.com''
s.sh: line 1: `if [[ ( ! grep '/example.com' /opt/nfs &>/dev/null ) || ( ! grep -R '/example.com' /data &>/dev/null) ]]'

直截了當的方法:

grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data
if [ $? -eq 0 ]; then   # check exit status
   echo "Passed"
else 
   echo "Failed"
fi

  • grep-q選項告訴不要向標準輸出寫入任何內容。0如果找到任何匹配項,即使檢測到錯誤,也會立即以零狀態退出。
  • $?- 包含最後一個命令執行的退出狀態程式碼

以上也可以簡化為:

if grep -q '/example.com' /opt/nfs || grep -Rq '/example.com' /data; then
   echo "Passed"
else 
   echo "Failed"
fi

[[...]]是用於執行比較和其他類型的測試的構造。它是一個ksh命令,其解析遵循特殊的語法規則並替換[標準命令(使用普通的簡單命令解析)。

在這裡,沒有用。您要測試的是命令是否成功(不是一個grep或命令),所以它只是:grep``[[...]]``[

if grep -qF /example.com /opt/nfs || grep -RqF /example.com /data
then echo passed
else echo failed
fi

-q抑制輸出並通過在找到一個匹配項後立即退出而不是嘗試查找所有匹配項來進行優化。

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