gpt4 book ai didi

bash - 大括号展开和参数展开的顺序

转载 作者:行者123 更新时间:2023-12-03 19:06:09 25 4
gpt4 key购买 nike

StackOverflow 上的一个常见比喻 是:“为什么 x=99; echo {1..$x} 不起作用?”答案是“因为大括号在参数/变量之前展开”

因此,我认为应该可以使用单个 $ 和大括号扩展多个变量。我期望 a=1; b=2; c=3; echo ${{a..c}} 打印 1 2 3。首先,内部大括号将扩展为 ${a} ${b} ${c}(它在编写 echo\${{a..c}} 时会这样做>).然后该结果将进行参数扩展。
但是,我得到了 -bash: ${{a..c}}: bad substitution 所以 {a..c} 根本没有展开。

Bash's manual更具体一点(强调我的)。

Expansion is performed on the command line after it has been split into tokens [...]The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and filename expansion.

请注意该列表中的 ;,。 “从左到右的方式”似乎适用于 ; 之前的整个(因此是无序的)列表。就像数学运算符 */ 没有优先级一样。

好吧,大括号展开并不真的比参数展开有更高的优先级。只是 {1..$x}${{a..c}} 都是从左到右计算的,意思是大括号 { 出现在参数 $x 之前,参数 ${ 出现在大括号 {a..c} 之前。

我是这么想的。但是,当使用 $ 而不是 ${ 时,左侧的参数会在右侧的大括号之后展开:

# in bash 5.0.3(1)
x=nil; x1=one; x2=two
echo ${x{1..2}} # prints `-bash: ${x{1..2}}: bad substitution`
echo $x{1..2} # prints `one two`

问题

  • 会不会是 bash 手册有问题,还是我看错了?
  • 如果手册有缺陷:所有扩展的确切顺序是什么?

我只是问,因为我很好奇。我不打算在任何地方使用像 $x{1..2} 这样的想法。我对处理多个变量的更好的解决方案替代方案不感兴趣(例如数组切片${array[@]:1:2} ).我只是想获得更深入的了解。

最佳答案

来自:https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html

To avoid conflicts with parameter expansion, the string ‘${’ is notconsidered eligible for brace expansion, and inhibits brace expansionuntil the closing ‘}’.

也就是说,对于 echo $x{1..2} ,首先进行大括号展开,然后进行参数展开,所以我们有 echo $x1 $x2。对于 echo ${x{1..2}} 大括号扩展不会发生,因为我们在 ${ 之后并且还没有到达结束 } 参数扩展。

关于您引用的 bash 手册部分,扩展仍然存在从左到右的顺序(相对于允许的嵌套)。如果您格式化列表而不是使用 ,事情会变得更清楚;:

  1. 大括号展开
  2. 以从左到右的方式:
    波浪号扩展、参数和变量扩展、算术扩展和命令替换
  3. 分词
  4. 文件名扩展。

关于bash - 大括号展开和参数展开的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63614204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com