
我有一個在 FreeBSD 機器上運行的簡單腳本,程式碼如下:
#!/bin/sh
`sed -i .bak '\:#start 172.0.0.3:,\:#end 172.0.0.3:d' /usr/local/etc/racoon/racoon.conf`
echo $?
它應該刪除兩個模式之間的文字區塊。
問題是,如果我直接從 shell 執行 sed 命令,它可以工作,如果我運行腳本,回傳碼是 0。
為什麼?
答案1
您需要消除反引號並將單引號變更為雙引號:
#!/bin/sh
ip=$1
echo $ip
sed -i .bak "\:#start ${ip}:,\:#end ${ip}:d" /usr/local/etc/racoon/racoon.conf
使用雙引號將允許擴展變數。反引號將嘗試執行命令的標準輸出(在本例中沒有)。例如,如果您這樣做,`echo hi`
它會嘗試將“hi”作為命令執行。sed
無論是否進行替換,除非出現錯誤,否則始終傳回 0。
答案2
反引號確實沒有必要(或者也許我理解你錯了)。事實上,腳本回傳 0 也是預期的:退出代碼 0 就可以了。編輯: sed 將始終以 0 退出,即使沒有替換。只有當語法存在錯誤時才會產生另一個退出代碼。
更有趣的是:程式碼到底刪沒刪?
從您的評論來看,您可能遇到正規表示式和/或其中轉義字元的問題。