Bagaimana cara menulis banyak string baris menggunakan Bash dengan variabel?

232

Bagaimana saya bisa menulis multi-baris dalam file yang disebut myconfig.confmenggunakan BASH?

#!/bin/bash
kernel="2.6.39";
distro="xyz";

echo <<< EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL >> /etc/myconfig.conf;
cat /etc/myconfig.conf;
Chris Stryczynski
sumber

Jawaban:

471

Sintaks ( <<<) dan perintah yang digunakan ( echo) salah.

Yang benar adalah:

#!/bin/bash

kernel="2.6.39"
distro="xyz"
cat >/etc/myconfig.conf <<EOL
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

cat /etc/myconfig.conf

Konstruksi ini disebut sebagai Dokumen Di Sini dan dapat ditemukan di halaman manual Bash di bawah man --pager='less -p "\s*Here Documents"' bash.

ktf
sumber
49
dan jika Anda ingin menambahkannya akan menjadi kucing >>
Atau Gal
19
Ini berfungsi dengan baik, tetapi Anda harus memastikan bahwa tidak ada spasi putih di depan penghentian EOF, jika tidak maka tidak akan dikenali, dan Anda akan mengalami akhir kesalahan file yang tidak terduga .
nwinkler
10
@StevenEckhoff Ini disebut heredoc.
William Pursell
4
Bagaimana jika saya memerlukan izin sudo untuk menulis ke file?
gfpacheco
14
@ gfpacheco Anda dapat menggunakan tee untuk itu, seperti kucing << EOL | sudo tee /etc/myconfig.conf
Xin Chen
74
#!/bin/bash
kernel="2.6.39";
distro="xyz";

cat > /etc/myconfig.conf << EOL
line 1, ${kernel}
line 2,
line 3, ${distro}
line 4
line ...
EOL

ini melakukan apa yang Anda inginkan.

Kent
sumber
6
@ ktf saya mengetik tidak lebih cepat, tetapi lebih sedikit surat dari Anda. ^ _ *
Kent
35

Jika Anda tidak ingin variabel diganti, Anda harus mengelilingi EOL dengan tanda kutip tunggal.

cat >/tmp/myconfig.conf <<'EOL'
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
EOL

Contoh sebelumnya:

$ cat /tmp/myconfig.conf 
line 1, ${kernel}
line 2, 
line 3, ${distro}
line 4 line
... 
Tk421
sumber
14

Solusi heredoc tentu merupakan cara paling umum untuk melakukan ini. Solusi umum lainnya adalah:

gema 'baris 1,' "$ {kernel}" '
baris 2,
baris 3, '"$ {distro}"'
baris 4 '> /etc/myconfig.conf

dan

exec 3> & 1 # Simpan stdout saat ini
exec> /etc/myconfig.conf
echo line 1, $ {kernel}
garis gema 2, 
garis gema 3, $ {distro}
...
exec 1> & 3 # Pulihkan stdout
William Pursell
sumber
Mungkin juga menunjuk ke printfyang memperkenalkan beberapa variasi yang lebih menarik.
tripleee
3

Mekanisme di bawah ini membantu mengarahkan beberapa baris ke file. Simpan string lengkap di bawah "agar kita dapat mengarahkan ulang nilai variabel.

#!/bin/bash
kernel="2.6.39"
echo "line 1, ${kernel}
line 2," > a.txt
echo 'line 2, ${kernel}
line 2,' > b.txt

Konten a.txtis

line 1, 2.6.39
line 2,

Konten b.txtis

line 2, ${kernel}
line 2,
rashok
sumber