Saya ingin menulis variabel array bash ke file, dengan setiap elemen pada baris baru. Saya bisa melakukan ini dengan for for loop, tetapi apakah ada cara lain (bersih) untuk bergabung dengan elemen \n
?
50
Inilah cara yang memanfaatkan ekspansi parameter bash dan IFS
variabel khususnya.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
Kami menggunakan subkulit untuk menghindari menimpa nilai IFS
dalam lingkungan saat ini. Dalam subkulit itu, kami kemudian memodifikasi nilai IFS
sehingga karakter pertama adalah baris baru (menggunakan $'...'
kutipan). Akhirnya, kami menggunakan ekspansi parameter untuk mencetak isi array sebagai satu kata; setiap elemen dipisahkan oleh karakter pertama dari IFS
.
Untuk menangkap ke suatu variabel:
$ var=$( IFS=$'\n'; echo "${System[*]}" )
Jika pesta Anda cukup baru (4.2 atau yang lebih baru), Anda dapat (dan harus) masih menggunakan printf
dengan -v
pilihan:
$ printf -v var "%s\n" "${System[@]}"
Dalam kedua kasus itu, Anda mungkin tidak ingin baris baru final masuk var
. Untuk menghapusnya:
$ var=${var%?} # Remove the final character of var
var=${var%?}
? Ini bukan ekspresi reguler, jadi.
hanya akan cocok dengan karakter titik.$ IFS=', ' $ echo ${VAR[*]} first second third $ echo "${VAR[*]}" first,second,third
Anda dapat menggunakan
printf
untuk mencetak setiap item array pada barisnya sendiri:sumber
atau
atau
atau
atau
atau
atau
atau
itu yang bisa saya ingatkan sejauh ini.
sumber
Solusi di atas cukup banyak, tetapi pertanyaan aslinya meminta output ke file:
Catatan: 1) 'echo' memberikan baris terakhir akhir 2) Jika file ini hanya akan dibaca oleh bash lagi, maka menyatakan -p mungkin serialisasi yang diinginkan.
sumber
Menggunakan untuk :
Menggunakan sejarah ; perhatikan ini akan gagal jika nilai Anda mengandung
!
:Menggunakan nama bas ; perhatikan ini akan gagal jika nilai Anda mengandung
/
:Menggunakan shuf ; perhatikan bahwa hasilnya mungkin tidak keluar secara berurutan:
sumber
Pilihan saya , hanya menggunakan Bash bawaan, tanpa bermutasi
IFS
:Contoh
Anda juga dapat menggunakan pemisah apa pun:
sumber
printf
tampaknya menjadi pendekatan yang paling efisien untuk membuat string yang dibatasi dari array:Cara yang lebih sederhana untuk melakukan ini adalah:
Contoh
sumber