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[@]}"