2013-08-28 24 views
1

我是新來bash和我看到有被Bash進行自動分詞:慶典詞的拆分機制

a="1 2  3 4" 

如果我贊同「一」,由echo $a1 2 3 4,已經做了分詞含蓄。如果我循環「a」,我分別得到1,2,3和4。

我也是從那個here

外殼掃描參數擴展的結果,命令 替代,而沒有爲內分詞 雙引號發生算術擴展閱讀。

而且我還發現,如果我有

b=$a; 
echo "$b" 

我會得到

"1 2 3 4" 

所以,這裏是我的問題:當在分詞做了什麼?它會改變字符串本身嗎?當我使用echofor(循環)時,它纔會生效嗎?更一般的,bash在地球上如何處理它?

非常感謝!

回答

1

閱讀man bash。對於分配,它說

所有的值進行波浪線擴展,參數和變量擴展,命令替換,算術擴展和引用刪除[...]不進行詞的拆分,以「$ @」的例外如下面在特殊參數下所述。不執行路徑名擴展。

詞的拆分也不會[[ ]]條件下發生:

字的拆分和路徑擴展[[和]]

+0

非常感謝!但是bash是否會在通話中進行分詞而不是一次?我的意思是,Bash總是在必要時進行分裂,但不是第一次做,然後保存它?如果它多次拆分相同的字符串,我認爲效率沒有得到很好的考慮? – dragonxlwang

0

其實有幾個之間的話,不執行一輪分詞。第一個是在解析命令行之前執行的,因此echo $a分爲兩個詞echo$a。 (這就是爲什麼像a="echo foo | wc -l"; $a這樣的東西沒有執行管道;在擴展$a之前解析完成)。在該輪分詞結束之後,參數擴展發生以產生2個字符串,echo1 2 3 4。由於參數擴展而產生的字符串本身經歷了分詞,因爲它沒有被引用,產生4個附加詞1,2,34

在for循環中,在列表中的項目都受到字分裂:

for b in $a; do 

膨脹(後字分割產生forbin$a;do)至for,b,in,1 2 3 4,;do。再一次,由參數展開產生的字符串經歷了分詞到1,2,34

0

擊可以作爲下一個 - 解析腳本或命令行時:

  1. 解析和詞法分析
  2. 膨脹
    1. 括號擴展
    2. TIDLE膨脹
    3. 變量擴展
    4. 算術和其他替換
    5. 命令替換
    6. 分詞
    7. 名代(通配符)
  3. 去掉引號

,你可以看到,這個詞拆分已接近結束,打完例如算術擴展但在文件名匹配之前,刪除引號是最後一步。