2011-08-21 113 views
1

我想寫一小段代碼將一個小公式傳遞給另一個程序,但是我發現公式啓動時發生了一些奇怪的事情與11 *(:11 *(...)作爲bash參數不帶引號

$ echo 11*15 

整齊打印'11 * 15'

$ echo 21*(15) 

整齊打印'21 *(15)」,而

echo 11*(15) 

只給出'11'。至於我發現這隻發生在'11 *('。我知道這可以通過使用適當的引號來解決,但我仍然好奇爲什麼會發生這種情況。

有誰知道嗎?

+1

你有一個叫做11的文件嗎? – Joshua

+1

一個名爲'11'的文件不能解釋這種行爲 - 事實上我想不出任何會發生什麼。我得到了'bash:附近的意外標記附近的語法錯誤'(''。 –

+0

'echo 11 *'print什麼? –

回答

2

你的程序是如何編碼的?如果它的編碼採取的參數,然後通過你的公式一樣

./myprogram "11*15" 

echo '11*15' | myprogram 

如果回聲,就像在命令行上,你可以無意中顯示文件名中有11的文件

+0

+1你一定要在它周圍加引號,爲什麼你會選擇不呢?引用一個字符串的想法是一個shell參數是爲了避免這樣的情況,它會在shell中意外觸發其他東西而不是回顯相同的確切字符串。 Bash shell文檔狀態:*引用用於刪除某些字符或單詞對shell的特殊含義。引用可用於禁用特殊字符的特殊處理,以防止保留字被識別,並防止參數擴展。* – darvids0n

+0

我沒有想過檢查主目錄中是否有以11開頭的文件名然而。我查了一下,只有一個名爲11的文件。刪除它後,echo正常工作。當然,引號會起作用,但我的好奇心是滿意的。 – Chris

0

11*(15)使用特定於Bash的擴展glob語法。你偶然發現了它,強調爲什麼引號是一個好主意。 (我也學到了不少追查爲什麼它爲我工作不同。感謝那個)

echo 11*(15) 

在bash會根據extglob是否啓用改變的行爲。如果啓用*(PATTERN-LIST)匹配零次或多次出現的模式。如果它被禁用,它不會,並且由此產生的(可能會導致語法錯誤。

例如:

$ ls 
11 115 1155 11555 115555 
$ shopt -u extglob 
$ echo 11*(55) 
bash: syntax error near unexpected token `(' 
$ shopt -s extglob 
$ echo 11*(55) 
11 1155 115555 
$ 

(這解釋奇數行爲我在註釋中所討論的。)

從在bash 4.2.8文檔(info bash)報價:

如果`extglob'shell選項使用`shopt'內建來啓用, 幾個擴展模式匹配操作符被識別。在以下描述中的 中,PATTERN-LIST是由`|'分隔的一個或多個 模式的列表。使用 一個或多個以下子圖案可以形成複合圖案:

'?(圖案列表)' 匹配給定圖案的零次或一次出現。

`*(PATTERN-LIST)' 匹配零個或多個出現的給定模式。

`+(模式列表)' 匹配一個或多個出現的給定模式。

`@(PATTERN-LIST)' 匹配給定模式之一。

`!(PATTERN-LIST)' 匹配除給定模式之外的任何內容。