我試圖演示替換的順序;主要是變量替換,命令替換和匹配依次發生。我執行了下面的命令,我沒有得到預期的輸出。Bash - 演示替換的順序
bash-4.1$ a=file*
bash-4.1$ ls $(echo $($(b=$a)))
我希望輸出列出與「文件」開頭的所有文件的名稱,而是它輸出目錄中的所有文件的列表。任何想法爲什麼?
我試圖演示替換的順序;主要是變量替換,命令替換和匹配依次發生。我執行了下面的命令,我沒有得到預期的輸出。Bash - 演示替換的順序
bash-4.1$ a=file*
bash-4.1$ ls $(echo $($(b=$a)))
我希望輸出列出與「文件」開頭的所有文件的名稱,而是它輸出目錄中的所有文件的列表。任何想法爲什麼?
$(...)
命令替換將返回命令的輸出,該命令的輸出對於賦值爲空。所以你只需要運行ls
。
這是否意味着所有3個替換不能在一行中顯示? – SharkTiles
'ls $(echo「$ a」)'適合你嗎? (請注意,有兩種機會,因此我不得不將其中一個關閉。) – Neil
我仍然得到相同的結果:( – SharkTiles
參數和算術擴展和命令替換是同時評估的,最左邊到最裏邊到右邊。賦值,空和空擴展以及重定向都是有效的簡單命令。該分配對於子外殼而言是丟失的,並且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))
請閱讀:[bash的DOC(http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions) – kev