Değişkenlerle Bash kullanarak birden çok satır dizesi nasıl yazılır?


232

myconfig.confBASH kullanarak adlandırılan bir dosyaya nasıl çok satır yazabilirim ?

#!/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;

Yanıtlar:


471

Sözdizimi ( <<<) ve kullanılan komut ( echo) yanlış.

Doğru olurdu:

#!/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

Bu yapı, Burada Belge olarak adlandırılır ve aşağıdaki Bash man sayfalarında bulunabilir man --pager='less -p "\s*Here Documents"' bash.


49
ve eklemek istiyorsanız kedi olurdu >>
Veya Gal

19
Bu harika çalışıyor, ancak sonlandırmanın önünde boşluk olmadığından emin olmalısınız EOF, aksi takdirde tanınmayacaktır ve beklenmeyen bir dosya sonu hatasıyla karşılaşacaksınız.
nwinkler

10
@StevenEckhoff Buna heredoc denir.
William Pursell

4
Dosyaya yazmak için sudo iznine ihtiyacım olursa ne olur?
gfpacheco

14
@gfpacheco Bunun için tee kullanabilirsiniz, örneğin kedi << 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

bu istediğinizi yapar.


6
@ktf Daha hızlı değil, sizden daha az harf yazıyordum. ^ _ *
Kent

35

Değişkenlerin değiştirilmesini istemiyorsanız, EOL'yi tek tırnak işaretleri içine almanız gerekir.

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

Önceki örnek:

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

14

Yorumlu çözüm kesinlikle bunu yapmanın en yaygın yoludur. Diğer yaygın çözümler:

echo 'satır 1,' "$ {kernel}" '
hat 2,
satır 3, '"$ {distro}"'
satır 4 '> /etc/myconfig.conf

ve

exec 3> & 1 # Mevcut stdout'u kaydet
exec> /etc/myconfig.conf
echo line 1, $ {kernel}
yankı çizgisi 2, 
yankı satırı 3, $ {distro}
...
exec 1> & 3 # Stdout'u geri yükle

Belki de printfbazı ilginç varyasyonları ortaya çıkardığına işaret eder .
Üçlü

3

Aşağıdaki mekanizma birden fazla satırı dosyaya yönlendirmeye yardımcı olur. "Değişkenin değerlerini yeniden yönlendirebilmemiz için dizeyi tam olarak saklayın .

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

İçeriği a.txtDİR

line 1, 2.6.39
line 2,

İçeriği b.txtDİR

line 2, ${kernel}
line 2,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.