问题:
是否可以访问当前正在处理的 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 的位置。但如果不具体说明您想要实现的目标,就很难提供帮助。