访问 bash [内部] 大括号扩展迭代数/变量

ear*_*Lon 1 bash shell-script environment-variables brace-expansion

题:

是否可以访问当前正在处理的 bash 迭代次数?

伪命令

mv {1..5}.something.{1..5} $x1.$x2.something
Run Code Online (Sandbox Code Playgroud)
  • 注意:这是一个逻辑表示;一个非工作样本。

伪输出

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
Run Code Online (Sandbox Code Playgroud)
  • 其中 n 和 m 都是它们各自的大括号扩展的迭代。

说明

我熟悉循环,例如:

for x in {1..10}; do echo -n "$x "; done
Run Code Online (Sandbox Code Playgroud)

如您所见,bash 将迭代设置为 $x。我希望了解是否有可能,以及当我没有定义要使用的变量时如何访问 bash 使用的变量。当 bash 被赋予一个没有变量迭代的大括号扩展时,它必须以某种方式[内部]这样做。我希望这个变量可以在脚本运行时访问。

感谢#bash上的所有人

Mad*_*ist 5

您误解了支撑扩展的工作原理。请重新阅读上面丹尼斯威廉姆森的评论。

你在想,当我写的时候mv foo.{1,2,3} bar,shell 实际上是多次调用命令,就好像你输入了:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar
Run Code Online (Sandbox Code Playgroud)

如果这是真的,那么您的问题就有意义了:shell 正在运行多个命令,因此它必须保留一个列表。

但是,这不是正在发生的事情。大括号扩展扩展一个参数,然后调用生成的命令行一次。因此,对于上面的示例,shell 看到参数foo.{1,2,3}包含括号扩展,并将该参数扩展为三个参数foo.1 foo.2 foo.3。然后它将该扩展插入到命令行中以代替大括号参数,然后继续解析命令行。完成后,shell 会运行一个命令,如下所示:

mv foo.1 foo.2 foo.3 bar
Run Code Online (Sandbox Code Playgroud)

所以是的,可能当 shell 扩展那个大括号的参数时,它会保留一个列表,但是在其他参数的扩展中无法访问该列表,因为大括号扩展已完全完成,并且有关扩展的所有信息都已用完并被遗忘解析其他参数的时间。

无论如何,这种参数唯一有用的方法是,如果 shell 正在运行多个命令,而实际上并非如此。要运行多个命令,您必须使用真正的循环;大括号扩展不会这样做。

至于$_,这是一个 Perl 构造,可以用来代替循环变量(就像x在你的循环示例中一样),所以它与大括号扩展并不真正相关。