Как написать строку из нескольких строк, используя Bash с переменными?

232

Как я могу написать многострочный файл, называемый myconfig.confBASH?

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

Эта конструкция называется « Здесь документ» и может быть найдена на страницах руководства Bash ниже man --pager='less -p "\s*Here Documents"' bash.

КТФ
источник
49
и если вы хотите добавить это будет кот >>
Или Гал
19
Это прекрасно работает, но вы должны убедиться, что перед завершением нет пробелов EOF, иначе он не будет распознан, и вы столкнетесь с неожиданной ошибкой конца файла .
nwinkler
10
@ StevenEckhoff Это называется heredoc.
Уильям Перселл
4
Что если мне понадобится разрешение sudo для записи в файл?
gfpacheco
14
@gfpacheco Для этого вы можете использовать тройник, как кошка << EOL | sudo tee /etc/myconfig.conf
Синь Чен,
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
... 
Tk421
источник
14

Решения heredoc, безусловно, являются наиболее распространенным способом сделать это. Другие общие решения:

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что вводит еще несколько интересных вариантов.
tripleee
3

Механизм ниже помогает в перенаправлении нескольких строк в файл. Держите полную строку ниже, "чтобы мы могли перенаправить значения переменной.

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

Содержание a.txtIS

line 1, 2.6.39
line 2,

Содержание b.txtIS

line 2, ${kernel}
line 2,
rashok
источник