echo $(!ls)不输出变量名

时间:2018-04-12 03:24:36

标签: bash

有两种参数扩展可以返回在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 
    ...

背后的机制是什么?

1 个答案:

答案 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