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)
我熟悉循环,例如:
for x in {1..10}; do echo -n "$x "; done
Run Code Online (Sandbox Code Playgroud)
如您所见,bash 将迭代设置为 $x。我希望了解是否有可能,以及当我没有定义要使用的变量时如何访问 bash 使用的变量。当 bash 被赋予一个没有变量迭代的大括号扩展时,它必须以某种方式[内部]这样做。我希望这个变量可以在脚本运行时访问。
感谢#bash上的所有人
您误解了支撑扩展的工作原理。请重新阅读上面丹尼斯威廉姆森的评论。
你在想,当我写的时候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
在你的循环示例中一样),所以它与大括号扩展并不真正相关。