Як записати кілька рядкових рядків за допомогою Bash зі змінними?


232

Як я можу записати багато рядків у файл, який називається myconfig.confза допомогою 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;

Відповіді:


471

Синтаксис ( <<<) та команда, що використовується ( echo), неправильні.

Правильно було б:

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

Ця конструкція згадується як документ Here, і її можна знайти на сторінках Bash man у розділі man --pager='less -p "\s*Here Documents"' bash.


49
і якщо ви хочете додати це було б котом >>
Або Гал

19
Це чудово працює, але ви повинні переконатися, що перед закінченням немає пробілу EOF, інакше воно не буде розпізнане, і ви зіткнетеся з несподіваною помилкою в кінці файлу .
nwinkler

10
@StevenEckhoff Це називається гередок.
Вільям Перселл

4
Що робити, якщо для запису у файл мені потрібен дозвіл sudo?
gfpacheco

14
@gfpacheco Ви можете використовувати для цього трійник, як кішка << 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

це робить те, що ти хочеш.


6
@ktf Я набирав не швидше, але менше букв, ніж ви. ^ _ *
Кент

35

Якщо ви не хочете, щоб змінні були замінені, вам потрібно оточити EOL одинарними лапками.

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

Попередній приклад:

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

14

Рішення гередока, безумовно, є найпоширенішим способом цього зробити. Інші поширені рішення:

echo 'рядок 1,' "$ {kernel}" '
рядок 2,
рядок 3, "" $ {distro} "'
рядок 4 '> /etc/myconfig.conf

і

exec 3> & 1 # Зберегти поточну версію
exec> /etc/myconfig.conf
ехо-рядок 1, $ {kernel}
ехо-рядок 2, 
ехо-рядок 3, $ {distro}
...
exec 1> & 3 # Відновити викладку

Можливо, також вкажіть, printfщо представляє ще кілька цікавих варіацій.
трійка

3

Нижче механізм допомагає перенаправляти кілька рядків до файлу. Тримайте повний рядок під "тим, щоб ми могли перенаправляти значення змінної.

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

Зміст a.txtє

line 1, 2.6.39
line 2,

Зміст b.txtє

line 2, ${kernel}
line 2,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.