2016-01-20 65 views
1

shell腳本:當WORD是一個變量時,爲什麼在'case WORD in`語句中WORD的字段拆分不會發生?

#!/bin/sh 
a="foo bar" 

case $a in 
    "foo bar") 
     echo case 1 
     ;; 
esac 

case foo bar in 
    "foo bar") 
     echo case 2 
     ;; 
esac 

bash執行這導致下面的輸出和錯誤。

case 1 
foo: line 10: syntax error near unexpected token `bar' 
foo: line 10: `case foo bar in' 

dash執行此:

case 1 
foo: 10: foo: Syntax error: word unexpected (expecting "in")` leads to the following output and error. 

我不明白爲什麼第一case語句成功,但第二個沒有。

按了POSIX文件在http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05,將發生在兩種情況下場分裂,所以以後$a在第一case聲明擴展到foo bar,應該是相當於第二個。

所以兩者都應該失敗。爲什麼第一個case聲明成功?

+1

因爲第一個是單個字符串,第二個不是? – 123

+1

@ 123先觸摸「foo bar」'。然後按照你的邏輯,「a =」foo bar「; ls $ a'應該列出文件'foo bar',但'ls foo bar'應該不能這樣做,因爲第一個是單個字符串,第二個不是「。但實際上,這兩種命令都會因爲[字段拆分](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05)出現在兩種情況下都失敗,並且在兩種情況下我們都有兩個單詞,而不是一個,場分裂後。 –

+0

你爲什麼爭辯你顯然不明白的東西?看看下面的答案。 – 123

回答

3

詞的拆分是在爲情況下語句中使用的第一種情況下完成的。從POSIX

案例條件結構

的條件結構情況下應執行對應於的幾種模式的第一個中的化合物列表 (見模式 匹配表示法),其由該字符串匹配產生於 代字號擴展,參數擴展,命令替換,算術 擴展和引用移除給定的單詞。

所以,不管你引用與否,它不會被擴大,是不帶引號的安全。

case $a in 
    ... 
esac 

case "$a" in  
    ... 
esac 

會按預期運行。

顯然,這不等同於case case中有兩個單詞的第二個示例。

相關問題