回答:
あなたが試してみたいことがあります:
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[@]}"