我试图证明替换顺序;主要是变量替换、命令替换和通配符依次发生。我执行了以下命令,但没有得到预期的输出。
bash-4.1$ a=file*
bash-4.1$ ls $(echo $($(b=$a)))
我希望输出列出以“文件”开头的所有文件名,但它会输出目录中所有文件的列表。知道为什么吗?
我试图证明替换顺序;主要是变量替换、命令替换和通配符依次发生。我执行了以下命令,但没有得到预期的输出。
bash-4.1$ a=file*
bash-4.1$ ls $(echo $($(b=$a)))
我希望输出列出以“文件”开头的所有文件名,但它会输出目录中所有文件的列表。知道为什么吗?
$(...)
命令替换返回命令的输出,对于分配,它是空白的。所以你只是最终运行ls
。
参数和算术扩展以及命令替换同时被评估,从最左到右。赋值、空和空扩展以及重定向都是有效的简单命令。分配丢失到子shell,并且参数echo
扩展为空。echo
输出换行符,但命令替换将其删除,并且ls
没有得到任何参数。此外,如果您希望a=file*
做的不仅仅是分配文字字符串,那么在分配中不会发生路径名扩展。
见:http ://wiki.bash-hackers.org/syntax/grammar/parser_exec
当您弄清楚所有这些时,这是一个具有挑战性的问题。的价值是x
多少?(显示更多扩展顺序和一些小的 Bash 怪癖。)
declare -i x=0
x+=${x:-1} let x+=2 $((x+=4)) {x}<&$((x+=8,0))