【问题标题】:Can't combine brace expansion with parameter expansion in bash [duplicate]无法将大括号扩展与bash中的参数扩展结合起来[重复]
【发布时间】:2015-12-10 00:56:34
【问题描述】:
$ set a b c
$ echo $1 $2 $3
a b c
$ echo ${1..3}
-bash: ${1..3}: bad substitution

我想用大括号扩展来回显 $1 $2 $3。但它不起作用。

扩展的顺序是:大括号扩展、波浪号扩展、参数、变量和算术扩展和命令替换(在一个 从左到右的方式)、分词和路径名扩展。

根据bash手册,大括号扩展是在参数扩展之前进行的。

所以我认为bash应该先对${1..3}进行大括号扩展,将其转换为echo $1 $2 $3,然后再进行参数扩展。

然而,事实是 bash 抱怨 ${1..3} 是一个糟糕的替代品。 这是为什么呢?

PS: 谢谢你们!你们所有的答案都很棒。但我认为

Ignacio Vazquez-Abrams 的回答更接近我想要的。

【问题讨论】:

    标签: bash brace-expansion parameter-expansion


    【解决方案1】:

    它认为大括号是参数替换的一部分,因为它跟在一个美元符号之后,并且“$1..3”是一个无效的变量名。

    改用“${@:1:3}”。

    【讨论】:

      【解决方案2】:

      Ignacio's answer 是正确的做法,但这里有一些关于如何让它按照你开始的方式工作的更多细节。

      您希望 ${1..3} 扩展到 $1 $2 $3。我们不能连接 ${1..3} 并让它工作,否则 bash 会将其解释为参数扩展(并失败)。要将其解释为大括号扩展,请通过转义美元符号来中和它:

      user$ echo \${1..3}
      $1 $2 $3
      

      正如您所注意到的,它输出美元表达式而不计算它们。这是因为引号删除(将\$ 转换回$ 的部分)是在参数扩展之后执行的。所以我们需要通过eval 运行它:

      user$ eval echo \${1..3}
      a b c
      

      当它可以写成echo "$@"时比需要的更复杂

      【讨论】:

      • 这不应被解释为建议使用 eval
      猜你喜欢
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多