回答:
あなたが試してみたいことがあります:
eval rm foo.{$ext0..$extN}
これが最良の答えであるかどうかはわかりませんが、確かに1つです。
{$one..$three}、それはこの場合には、整数を期待ブレース拡張の有効な形式ではありませんので、それが唯一の$ VARの拡張後の有効な形になり...、これはeval、通常のブレースシーケンス拡張を生成するために同じプロセスを通過... 1 2 3 QED;)...概要:単純なプレゼンスブレース対does'tトリガーブレース膨張...唯一の有効なフォームトリガーは。
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、あなたは伝統的なCスタイルの使用できるfor算術文脈でループを。変数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[@]}"