Saya ingin menggunakan $var in
ekspansi brace shell dengan kisaran, di bash. Sederhananya {$var1..$var2}
tidak bekerja, jadi saya pergi "lateral" ...
Berikut ini berfungsi, tetapi agak kumuh.
# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments
Apakah ada cara yang lebih "normal"?
shell
bash
brace-expansion
Peter.O
sumber
sumber
{$one..$three}
, karena itu bukan bentuk valid dari ekspansi-brace, yang dalam hal ini mengharapkan bilangan bulat ... Ini hanya menjadi bentuk yang valid setelah ekspansi $ var, yangeval
kemudian melewati proses yang sama untuk menghasilkan ekspansi urutan brace normal ... 1 2 3 QED;) ... Ringkasan: kehadiran sederhana dari pasangan brace tidak memicu ekspansi brace ... hanya bentuk yang valid yang memicu itu .a={0..9}; echo $a;
tidak ada ekstensi brace . Menggunakaneval
, itu berhasil. Jadi saya pikir penjelasan @ mattdm baik.Seperti yang sudah Anda sadari,
{1..3}
ekspansi ke1 2 3
tetapi{foo..bar}
atau{$foo..$bar}
tidak memicu ekspansi penjepit, dan yang terakhir kemudian diperluas untuk menggantikan$foo
dan$bar
dengan nilai-nilai mereka.Sebuah fallback pada GNU (mis. Linux yang tidak tertanam) adalah
seq
perintahnya.Kemungkinan lain. jika
foo.
tidak mengandung karakter khusus shell, adalahSolusi paling sederhana adalah menggunakan zsh, di mana
rm foo.{$ext0..$extN}
melakukan apa yang Anda inginkan.sumber
Sementara jawaban lain membahas penggunaan
eval
danseq
, dalambash
, Anda dapat menggunakanfor
loop gaya C tradisional dalam konteks aritmatika. Variabelext0
danextN
diperluas di dalam((..))
menyebabkan loop dijalankan untuk rentang yang ditentukan.Jika Anda mencari cara yang optimal dan menghindari beberapa
rm
perintah, Anda dapat menggunakan placeholder sementara untuk menyimpan hasil nama file dan memanggilrm
dalam satu tembakan.dan sekarang panggil
rm
perintah pada array yang diperluassumber
Catatan:
sumber