如何在序列的 shell 括号扩展中使用 $variable?

Pet*_*r.O 46 shell bash brace-expansion

我想$var in在 bash 中使用带有范围的 shell 括号扩展。简单地放置{$var1..$var2}不起作用,所以我去了“横向”......

以下工作,但它有点笨拙。

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Run Code Online (Sandbox Code Playgroud)

有没有更“正常”的方式?

aso*_*ove 46

您可能想尝试:

eval rm foo.{$ext0..$extN}
Run Code Online (Sandbox Code Playgroud)

不确定这是否是最佳答案,但肯定是最佳答案。

  • 我只是“明白”了它!...`{$one..$three}` 没有*没有大括号扩展*,因为它不是大括号扩展的有效形式,在这种情况下需要整数......它仅在 $var 扩展之后才成为有效形式,然后 `eval` 通过相同的过程生成正常的括号序列扩展... 1 2 3 QED ;) ... 总结:a 的简单 *存在*大括号对不会触发大括号扩展……只有有效的形式才能触发它。 (6认同)
  • 在 bash 中,{} 扩展发生在 $ 扩展之前,所以我认为除了使用 eval 或其他一些技巧导致两次通过表达式之外,没有任何其他方法可以做到这一点。 (4认同)

Gil*_*il' 25

正如你已经意识到,{1..3}扩大到1 2 3,但{foo..bar}还是{$foo..$bar}不触发括号展开,而后者随后被扩大,以取代$foo$bar它们的值。

GNU(例如非嵌入式Linux)的后备是seq命令。

for x in `seq $ext0 $extN`; do rm foo.$x; done
Run Code Online (Sandbox Code Playgroud)

另一种可能性。如果不foo.包含外壳特殊字符,则为

rm `seq $ext0 $extN | sed 's/^/foo./'`
Run Code Online (Sandbox Code Playgroud)

最简单的解决方案是使用zsh,rm foo.{$ext0..$extN}你想要的在哪里。