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;

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.


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.


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
... 

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

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,
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.