2012-06-18 21 views
0

我試圖演示替換的順序;主要是變量替換,命令替換和匹配依次發生。我執行了下面的命令,我沒有得到預期的輸出。Bash - 演示替換的順序

bash-4.1$ a=file* 
bash-4.1$ ls $(echo $($(b=$a))) 

我希望輸出列出與「文件」開頭的所有文件的名稱,而是它輸出目錄中的所有文件的列表。任何想法爲什麼?

+0

請閱讀:[bash的DOC(http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions) – kev

回答

2

$(...)命令替換將返回命令的輸出,該命令的輸出對於賦值爲空。所以你只需要運行ls

+0

這是否意味着所有3個替換不能在一行中顯示? – SharkTiles

+0

'ls $(echo「$ a」)'適合你嗎? (請注意,有兩種機會,因此我不得不將其中一個關閉。) – Neil

+0

我仍然得到相同的結果:( – SharkTiles

1

參數和算術擴展和命令替換是同時評估的,最左邊到最裏邊到右邊。賦值,空和空擴展以及重定向都是有效的簡單命令。該分配對於子外殼而言是丟失的,並且echo的參數擴展爲無。 echo會輸出一個換行符,但是命令替換會將其去掉,並且ls不會得到任何參數。此外,如果您希望a=file*做更多的事情而不是分配一個文字字符串,路徑名擴展不會在賦值中發生。

請參見:http://wiki.bash-hackers.org/syntax/grammar/parser_exec

,也是一個挑戰問題,當你弄清楚了這一切,。 x的價值是多少? (示出了更多的膨脹順序和一些小擊怪異。)

declare -i x=0 
x+=${x:-1} let x+=2 $((x+=4)) {x}<&$((x+=8,0))