Làm thế nào để viết nhiều chuỗi dòng bằng Bash với các biến?


232

Làm cách nào tôi có thể viết nhiều dòng trong một tệp được gọi myconfig.confbằng 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;

Câu trả lời:


471

Cú pháp ( <<<) và lệnh được sử dụng ( echo) là sai.

Đúng sẽ là:

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

Cấu trúc này được gọi là Tài liệu ở đây và có thể được tìm thấy trong các trang của Bash man --pager='less -p "\s*Here Documents"' bash.


49
và nếu bạn muốn nối thêm thì đó sẽ là mèo >>
Hoặc Gal

19
Điều này hoạt động rất tốt, nhưng bạn phải đảm bảo rằng không có khoảng trắng trước khi kết thúc EOF, nếu không nó sẽ không được nhận ra và bạn sẽ gặp phải lỗi kết thúc không mong muốn .
nwinkler

10
@StevenEckhoff Đây được gọi là một di sản.
William Pursell

4
Nếu tôi cần quyền sudo để ghi vào tập tin thì sao?
gfpacheco

14
@gfpacheco Bạn có thể sử dụng tee cho điều đó, như con mèo << 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

đây là những gì bạn muốn


6
@ktf Tôi đã gõ không nhanh hơn, nhưng ít chữ hơn bạn. ^ _ *
Kent

35

Nếu bạn không muốn các biến được thay thế, bạn cần bao quanh EOL bằng các dấu ngoặc đơn.

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

Ví dụ trước:

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

14

Các giải pháp heredoc chắc chắn là cách phổ biến nhất để làm điều này. Các giải pháp phổ biến khác là:

lặp lại 'dòng 1,' "$ {kernel}" '
dòng 2,
dòng 3, '"$ {distro}"'
dòng 4 '> /etc/myconfig.conf

exec 3> & 1 # Lưu thiết bị xuất chuẩn hiện tại
thực thi> /etc/myconfig.conf
dòng echo 1, $ {kernel}
tiếng vang dòng 2, 
dòng echo 3, $ {distro}
...
thực hiện 1> & 3 # Khôi phục thiết bị xuất chuẩn

Có lẽ cũng chỉ ra printfmà giới thiệu một số biến thể thú vị hơn.
tripleee

3

Cơ chế dưới đây giúp chuyển hướng nhiều dòng đến tập tin. Giữ chuỗi hoàn chỉnh bên dưới "để chúng ta có thể chuyển hướng các giá trị của biến.

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

Nội dung của a.txt

line 1, 2.6.39
line 2,

Nội dung của b.txt

line 2, ${kernel}
line 2,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.