2013-01-18 58 views
13

這是非常有趣的是,如果你打算使用的代碼

x=0 
y=1 
echo "$x_$y" 

然後使用bash,顯示一個類似「0_1」它只會顯示

1 

我試圖echo "$x\_$y"和它不工作。

所以我的問題是如何回顯窗體$ x_ $ y?我將在文件名字符串上使用它。

+0

在vim中啓用語法着色。你會立即發現這樣的簡單錯誤。 – Dariusz

回答

23

由於變量名被允許在他們下劃線,命令:

echo "$x_$y" 

正在試圖迴應${x_}(這是頁碼在你的情況下爲空),然後是${y}。其原因是因爲參數擴展是一個貪婪的操作 - 在$之後將需要儘可能多的合法字符來形成一個變量名。

bash手冊頁狀態的相關部分:

$字符引入參數擴展,命令替換,或算術擴展。

要展開的參數名稱或符號可以用大括號括起來,這些大括號是可選的,但是用於保護變量從緊隨其後的字符展開,這可以被解釋爲名稱的一部分。

當使用大括號時,匹配的大括號是第一個}不會被反斜線或引用字符串轉義,也不在嵌入的算術擴展,命令替換或參數擴展中。

因此,解決的辦法是,以確保_作爲第一個變量,它是可以做到的部分處理:

echo "${x}_${y}" 

我傾向於做所有我的bash像這樣的變量,即使是獨立的如:

echo "${x}" 

因爲它更加明確,我已經咬了這麼多ti在過去的MES :-)

+0

使用具有語法高亮顯示的好的文本編輯器可以幫助用戶沉浸式地檢測這樣的毛刺,而不會使用明確的'$ {x}混淆所有代碼'符號。 – GreyCat

11

這樣:

$ echo "${x}_${y}" 
0_1 
8

包裝在大括號:

echo "${x}_${y}"

+0

任何人都知道爲什麼bash表現如此? 'echo「$ x。$ y」'。用'點'它正在工作。 – Suku

+6

,因爲變量中可以有下劃線,但不是圓點 - 下劃線表示它認爲您有變量,稱爲「$ x_」和「$ y」。但有點不會混淆 –

+1

變量名稱不能有點,值可以有任何東西 –

5

只是逆勢,你也可以這樣做:

echo $x'_'$y 

你可以引述和不帶引號的部分相鄰之間沒有空格。而且由於'不是變量名稱的合法字符,因此bash將僅替換$x。 :)

+0

這不適用於我的情況 –

+0

@ tomriddle_1234:它不起作用的方式?如果將參數用雙引號引起來,它將不起作用,但由於某種原因,該命令沒有雙引號。 –

+2

另一種處理方式是:'x = 0; Y = 1; Z = _;回聲「$ x $ z $ y」;' –