Answers:
您可能要尝试:
eval rm foo.{$ext0..$extN}
不确定这是否是最佳答案,但肯定是最佳答案。
{$one..$three}
,因为它不是支柱膨胀,在这种情况下,预计整数的有效形式......它只是变成了$ VAR扩张后的有效形式,其eval
然后通过相同的处理,生成正常支架序列膨胀...... 1 2 3 QED)...总结:简单存在一个的一对括号简化版,触发括号扩展的...只有一个有效的形式的触发器它。
a={0..9}; echo $a;
,没有括号扩展。使用eval
,它可以工作。所以我认为@mattdm的解释很好。
正如你已经意识到,{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
另一种可能性。如果foo.
包含外壳特殊字符,则为
rm `seq $ext0 $extN | sed 's/^/foo./'`
最简单的解决方案是使用zsh,在rm foo.{$ext0..$extN}
您想要的地方做什么。
当其他答案讨论在中使用eval
和seq
时bash
,您可以for
在算术上下文中使用传统的C样式循环。变量ext0
和extN
在((..))
导致循环运行的范围内扩展。
for (( idx = ext0; idx <= extN; idx++ )); do
[[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
rm "$foo.$idx"
done
如果您正在寻找一种最佳方法并且避免使用多个rm
命令,则可以使用一个临时占位符来存储文件名结果并调用rm
。
results=()
for (( idx = ext0; idx <= extN; idx++ )); do
[[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
results+=( "$foo.$idx" )
done
现在rm
在扩展数组上调用命令
rm -- "${results[@]}"