Misalkan saya memiliki variabel shell Unix seperti di bawah ini
variable=abc,def,ghij
Saya ingin mengekstrak semua nilai ( abc
, def
dan ghij
) menggunakan for loop dan meneruskan setiap nilai ke dalam sebuah prosedur.
Skrip harus memungkinkan ekstraksi sejumlah nilai yang dipisahkan koma dari $variable
.
Jawaban:
Anda dapat menggunakan skrip berikut untuk melintasi variabel Anda secara dinamis, tidak peduli berapa banyak bidang yang dimilikinya selama hanya dipisahkan dengan koma.
Alih-alih
echo "$i"
panggilan di atas, antara loop fordo
dandone
di dalam, Anda bisa menjalankan prosedur Andaproc "$i"
.Pembaruan : Cuplikan di atas berfungsi jika nilai variabel tidak mengandung spasi. Jika Anda memiliki persyaratan seperti itu, gunakan salah satu solusi yang dapat berubah
IFS
, lalu parsing variabel Anda.Semoga ini membantu.
sumber
$variable
berisi spasi kosong, misalnyavariable=a b,c,d
=> mencetak 4 baris (a | b | c | d) daripada 3 (ab | c | d)"value
**. bisakah Anda memperbarui jika ada regex untuk menghapusnya ..Tidak mengotak-atik IFS
Tidak memanggil perintah eksternal
Menggunakan manipulasi string bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
sumber
IFS
!$i
berisi spasi, nilai tersebut akan dipisahkan (dan mungkin itulah alasannya diteruskan sebagai dipisahkan koma daripada dipisahkan spasi)for i in ${variable//,/$IFS} do; echo "$i"; done
Jika Anda menyetel pemisah bidang yang berbeda, Anda dapat langsung menggunakan
for
loop:Anda juga dapat menyimpan nilai dalam sebuah array dan kemudian mengulanginya seperti yang ditunjukkan dalam Bagaimana cara membagi string pada pembatas di Bash? :
Uji
Anda dapat menemukan pendekatan yang lebih luas dalam solusi ini untuk Cara mengulang melalui daftar yang dipisahkan koma dan menjalankan perintah untuk setiap entri .
Contoh pendekatan kedua:
sumber
while
untuk membaca ke dalam array dan satu lagi untuk mengulang melalui hasil.IFS
kembali ke sebelumnya?Saya lebih suka menggunakan tr daripada sed, karena sed memiliki masalah dengan karakter khusus seperti \ r \ n dalam beberapa kasus.
solusi lainnya adalah mengatur IFS ke pemisah tertentu
sumber
Berikut adalah solusi berbasis tr alternatif yang tidak menggunakan gema, diekspresikan sebagai satu baris.
Rasanya lebih rapi tanpa gaung tapi itu hanya preferensi pribadi saya.
sumber
Coba yang ini.
sumber
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. Setelah itu buat perulangan menjadi while loop. Anda bisa mendapatkan yang itu.Solusi lain tidak menggunakan IFS dan masih mempertahankan ruang:
sumber
Inilah solusi bash murni saya yang tidak mengubah IFS, dan dapat menggunakan pembatas regex kustom.
sumber