$var in
を使用して、bashで範囲付きのシェルブレース展開を使用したいと思います。単に{$var1..$var2}
を置くだけでは機能しないので、「横向き」にしました...
次のように動作しますが、少し厄介です。
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
より「通常の」方法はありますか?
あなたは試してみたいかもしれません:
eval rm foo.{$ext0..$extN}
これが最良の答えかどうかはわかりませんが、確かに1つです。
他の回答では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[@]}"
function f_over_range {
for i in $(eval echo {$1..$2}); do
f $i
done
}
function f {
echo $1
}
f_over_range 0 5
f_over_range 00 05
ノート: