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

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

问题:

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

伪命令

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

伪输出

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

说明

我熟悉循环,例如:

for x in {1..10}; do echo -n "$x "; done

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

感谢所有参与的人#bash

答案1

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

您认为当我写 时mv foo.{1,2,3} bar,shell 实际上多次调用该命令,就好像您输入了:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

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

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

mv foo.1 foo.2 foo.3 bar

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

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

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

答案2

具体来说mv,您可以简单地使用该-v标志来查看当前正在处理的内容。正如@DennisWilliamson 指出的那样,没有为大括号扩展序列设置变量 -writingecho {1..5}等同于writing echo 1 2 3 4 5。比较echo "$foo"- 事后无法知道哪个变量被echo编辑了。

答案3

为什么不使用自己的变量来计算迭代次数并回显它。如果您想查看执行过程中发生了什么,请使用 -x 选项运行它。就像 bash -x 会告诉你 ex 的位置。但如果不具体说明您想要实现的目标,就很难提供帮助。

相关内容