2013-09-16 23 views
3

我有一個包含以下「if」語句的bash腳本。問題是我無法讓它在Debian上運行(它在Fedora和CentOS上運行良好)。「if」語句在Debian Linux上不起作用

if [ $1 == "--daily" ] # <--- line 116 
then 
countDaily 
elif [ $1 == "--monthly" ] # <--- line 119 
then 
countMonthly 
fi 

它運行後:

sh /home/kris/countsc.sh --daily 

我得到一個錯誤:

/home/kris/countsc.sh: 116: [: --daily: unexpected operator 
/home/kris/countsc.sh: 119: [: --daily: unexpected operator 
+5

您所標記的問題'bash',但你不使用bash shell。 – Marco

+0

此外,你應該包括一個shebang行來爲你的腳本選擇一個shell解釋器。否則,用戶不知道腳本是用哪種方言編寫的,並且可能使用POSIX shell來解釋bash腳本。使用shebang命令行腳本可以執行,然後自動選擇正確的shell。 – Marco

+0

@Marco我在這個腳本的開頭有一個'#!/ bin/bash'行。我沒有把它包括在這裏。 – Kristopher

回答

5

由於您使用的是sh而不是bash,因此應該使用一個等於=的字符串進行比較,而不是等於==。在測試語句中加雙引號變量也是一個好習慣(這個錯誤不是由錯誤的引用引起的)。

的比較應該是:

if [ "$1" = "--daily" ] 

elif [ "$1" = "--monthly" ] 
+0

這是正確的答案,但我也能夠像這樣運行它:'if [「$ 1」==「 - daily」]'和'elif [「$ 1 「==」 - 每月「]」(不含空格)。奇怪。 – Kristopher

+5

@soulreaver如果你沒有空格,那麼整個塊'「$ 1」==「 - daily」'被認爲是一個字符串。由於該字符串是非空的,因此該命令將始終評估爲true – user000001

2

據我所知,沒有雙等於運營商test,這是用在這種情況下。如果你想測試字符串是否相等,只使用一個單一的等號,就像這樣:

if [ $1 = "--daily" ] 
elif [ $1 = "--monthly" ] 

你還應該記住包裝$1到報價的情況下,它包含空格。

您可能還想考慮在Bash中使用「新測試」指令,例如, [[和相應的]],它比sh的日子剩下的[有很多優點。查看this文檔以瞭解優點。

+4

這取決於你使用的是什麼版本的'test'。如果您使用的'sh'版本沒有'['作爲內置命令,並且您安裝了GNU coreutils,那麼'[''命令會將'=='識別爲'='的同義詞。 (你絕對不應該依賴這個) –