有两种参数扩展可以返回在bash文档中指定的变量名。
$ {!前缀*}
此扩展返回名称以prefix开头的现有变量的名称。$ {!名称[@]}
如果name是数组变量,则展开到名称中指定的数组索引(键)列表。
有些情况超出范围:
$ foo=1
$ echo $((${!foo}))
0
$ echo $(!ls)
echo $(ls -l)
total 272 -rw-r--r-- 1 me staff 0 Apr 8 16:37 2
...
背后的机制是什么?
答案 0 :(得分:4)
${!foo}
和${!foo*}
是两种非常不同的表达方式。 ${!foo}
扩展为名称存储在foo
:
$ foo=bar
$ bar=5
$ echo ${!foo} # => echo $bar
5
${!foo*}
扩展为以foo
$ foo1=1 foo2=2
$ echo ${!foo*}
foo1 foo2
$(!ls)
根本不是参数扩展;它是命令替换中的历史替代。 !ls
首先扩展为以ls
开头的最新命令,在您的示例中为ls -l
。然后通过命令替换执行该字符串,并捕获输出以用作echo
命令的参数。
$ echo $(!ls) => echo $(ls -l) => echo total 272 -rw-r--r-- 1 me staff 0 Apr 8 16:37 2
total 272 -rw-r--r-- 1 me staff 0 Apr 8 16:37 2