Como escrever várias linhas de seqüência de caracteres usando Bash com variáveis?

232

Como escrever várias linhas em um arquivo chamado myconfig.confusando 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;
Chris Stryczynski
fonte

Respostas:

471

A sintaxe ( <<<) e o comando used ( echo) estão incorretos.

Correto seria:

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

Essa construção é referida como um documento Here e pode ser encontrada nas páginas de manual do Bash em man --pager='less -p "\s*Here Documents"' bash.

ktf
fonte
49
e se você quiser acrescentar seria cat >>
Ou Gal
19
Isso funciona muito bem, mas você deve garantir que não haja espaço em branco na frente da finalização EOF, caso contrário não será reconhecido e ocorrerá um erro inesperado no final do arquivo .
Nwinkler
10
@StevenEckhoff Isso é chamado de heredoc.
William Pursell
4
E se eu precisar de permissão sudo para gravar no arquivo?
Gfpacheco
14
@gfpacheco Você pode usar tee para isso, como cat << 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

isso faz o que você quer.

Kent
fonte
6
@ktf Eu estava digitando não mais rápido, mas menos letras que você. ^ _ *
Kent
35

Se você não deseja que as variáveis ​​sejam substituídas, você precisa cercar o EOL com aspas simples.

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

Exemplo anterior:

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

As soluções heredoc são certamente a maneira mais comum de fazer isso. Outras soluções comuns são:

eco 'linha 1,' "$ {kernel}" '
linha 2,
linha 3, '"$ {distro}"'
linha 4 '> /etc/myconfig.conf

e

exec 3> & 1 # Salvar o stdout atual
exec> /etc/myconfig.conf
linha de eco 1, $ {kernel}
eco linha 2, 
eco linha 3, $ {distro}
...
exec 1> & 3 # Restaurar stdout
William Pursell
fonte
Talvez também aponte para o printfque introduz ainda mais variações interessantes.
Tripleee 27/10/2015
3

O mecanismo abaixo ajuda a redirecionar várias linhas para o arquivo. Mantenha a string completa em baixo "para que possamos redirecionar os valores da variável.

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

O conteúdo de a.txté

line 1, 2.6.39
line 2,

O conteúdo de b.txté

line 2, ${kernel}
line 2,
rashok
fonte