2017-03-02 76 views
0

在一個bash腳本中,我進行了這個測試。哪個工作完美。在IF語句中對可選參數進行測試

function copy_to_server { 
    if [ $1 -nt limit ]; then 

現在我希望允許第三個參數。但無論價值,測試通過:

function copy_to_server { 
    if [ $1 -nt limit ] || [ "$3"="-f" ] || [ "$3"="--force" ]; then 

如何正確測試我的參數?

+2

空格。你忘記'='周圍的空格。 – muru

+1

另外,'[「$ 3」=「-f」] || [「$ 3」=「--force」]'可以簡化爲'[[$ 3 =〜^( - f | --force)$]]',因爲缺少@muru空格,所以使用正則表達式運算符 – Inian

+0

。 – mickro

回答

1

您需要包括空格:

if [ "$1" -nt limit ] || [ "$3" = "-f" ] || [ "$3" = "--force" ]; then 

未能做到這一點,外殼認爲像一個參數測試的內部,並通過規範,用一個參數,一個測試返回「真」 (0)如果參數不爲空。

此外,請注意我在第一個測試中引用了$1:如果傳遞包含空白的參數,而不引用單詞分割,並且shell將看到多於三個參數並且語法錯誤失敗(或至少不會做你想做的事)。

如果您不介意特定於Bash的語法,則可以使用[[ ]]類型的測試,該測試不執行分詞。

if [[ $1 -nt limit ]] || [[ $3 = -f ]] || [[ $3 = --force ]]; then 

不過,到那個時候,你都可以把它們放在一起在一個單一的測試,因爲這種風格的測試還支持邏輯運算符:

if [[ $1 -nt limit || $3 = -f || $3 = --force ]; then 

請注意=!=運營商在[[ ]]測試做globbing,所以如果被測試的字符串包含可能觸發glob的東西(如*),則需要引用右側。

+0

不需要爲'$ 1'添加引號:這些參數不能直接被最終用戶訪問。 – mickro

+0

@ mickro如果您在調用上下文永遠不會通過多字參數的情況下安全,那麼它將起作用;我傾向於避免這種假設,因爲代碼往往會在某些時候被重用,但這是一個優先選擇的問題,所以從技術上講,不這樣做並不是「錯誤的」。 – Fred

+0

當然。你有一定道理。 – mickro