Saya perlu menulis beberapa xml kompleks ke variabel di dalam skrip bash. Xml harus dapat dibaca di dalam skrip bash karena ini adalah tempat fragmen xml akan hidup, itu tidak dibaca dari file atau sumber lain.
Jadi pertanyaan saya adalah ini jika saya memiliki string panjang yang saya ingin dapat dibaca manusia dalam skrip bash saya apa cara terbaik untuk melakukannya?
Idealnya saya mau:
- untuk tidak harus melarikan diri dari salah satu karakter
- memilikinya menerobos beberapa baris membuatnya dapat dibaca manusia
- simpan lekukan itu
Bisakah ini dilakukan dengan EOF atau sesuatu, dapatkah ada yang memberi saya contoh?
misalnya
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
Jawaban:
Ini akan menempatkan teks Anda ke dalam variabel Anda tanpa harus keluar dari tanda kutip. Ini juga akan menangani kutipan yang tidak seimbang (apostrof, yaitu
'
). Menempatkan tanda kutip di sekitar sentinel (EOF) mencegah teks mengalami ekspansi parameter. The-d''
penyebab untuk membaca beberapa baris (mengabaikan baris baru).read
adalah Bash built-in sehingga tidak perlu memanggil perintah eksternal seperticat
.sumber
cat
.cat
adalah perintah eksternal. Tidak menggunakannya menghemat melakukan itu. Plus, beberapa memiliki filosofi bahwa jika Anda menggunakan kucing dengan kurang dari dua argumen "Kamu salah" (yang berbeda dari "penggunaan tidak bergunacat
").set -e
. Tampaknyaread
selalu mengembalikan non-nol. Anda dapat mengentalkan perilaku ini dengan menggunakan! read -d .......
String
variabel multi-baris ini untuk menulis ke file, letakkan variabel di sekitar "QUOTES" sepertiecho "${String}" > /tmp/multiline_file.txt
atauecho "${String}" | tee /tmp/multiline_file.txt
. Butuh lebih dari satu jam untuk menemukan itu.Anda sudah hampir sampai. Entah Anda menggunakan cat untuk perakitan string Anda atau Anda mengutip seluruh string (dalam hal ini Anda harus melarikan diri dari kutipan di dalam string Anda):
sumber
'EOF'
atau"EOF"
, jika tidak, variabel shell akan diuraikan.Ini harus bekerja dengan baik dalam lingkungan shell Bourne
sumber
Namun cara lain untuk melakukan hal yang sama ...
Saya suka menggunakan variabel dan khusus
<<-
yang menghapus tabulasi di awal setiap baris untuk mengizinkan lekukan skrip:peringatan : tidak ada ruang kosong sebelumnya
Beberapa penjelasan:eof
tetapi hanya tabulasi ."${Pattern[*]}"
lakukan melemparkan array ini ke dalam string.IFS=";"
karena tidak ada;
string yang diperlukanwhile IFS=";" read file ...
mencegahIFS
dimodifikasi untuk sisa skrip. Dalam hal ini, hanyaread
gunakan yang dimodifikasiIFS
.sumber
mapfile
membutuhkan Bash 4 atau lebih tinggi. Dan sintaks"${Pattern[*]}"
melemparkan array ke dalam string ketika dalam tanda kutip (seperti yang ditunjukkan dalam kode contoh).Ada terlalu banyak kasus sudut di banyak jawaban lainnya.
Untuk benar-benar yakin tidak ada masalah dengan spasi, tab, IFS dll., Pendekatan yang lebih baik adalah dengan menggunakan konstruksi "heredoc", tetapi menyandikan isi dari heredoc menggunakan
uuencode
seperti yang dijelaskan di sini:https://stackoverflow.com/questions/6896025/#11379627 .
sumber