¿Cómo escribir cadenas de líneas múltiples usando Bash con variables?

232

¿Cómo puedo escribir líneas múltiples en un archivo llamado 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
fuente

Respuestas:

471

La sintaxis ( <<<) y el comando utilizado ( echo) es incorrecto.

Correcto sería:

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

Esta construcción se conoce como Documento Aquí y se puede encontrar en las páginas del manual de Bash debajo man --pager='less -p "\s*Here Documents"' bash.

ktf
fuente
49
y si quieres agregarlo sería gato >>
O Gal
19
Esto funciona muy bien, pero debe asegurarse de que no haya espacios en blanco delante de la terminación EOF, de lo contrario no se reconocerá y se encontrará con un error inesperado al final del archivo .
nwinkler
10
@StevenEckhoff Esto se llama heredoc.
William Pursell
44
¿Qué sucede si necesito permiso de sudo para escribir en el archivo?
gfpacheco
14
@gfpacheco Puedes usar tee para eso, como cat << EOL | sudo tee /etc/myconfig.conf
Xin Chen el
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

Esto hace lo que quieres.

Kent
fuente
66
@ktf Estaba escribiendo no más rápido, pero menos letras que tú. ^ _ *
Kent
35

Si no desea reemplazar las variables, debe rodear EOL con comillas simples.

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

Ejemplo anterior:

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

Las soluciones heredoc son sin duda la forma más común de hacer esto. Otras soluciones comunes son:

echo 'línea 1,' "$ {kernel}" '
línea 2,
línea 3, '"$ {distro}"'
línea 4 '> /etc/myconfig.conf

y

exec 3> & 1 # Guardar stdout actual
exec> /etc/myconfig.conf
echo línea 1, $ {kernel}
eco línea 2, 
echo línea 3, $ {distro}
...
exec 1> & 3 # Restaurar stdout
William Pursell
fuente
Quizás también apunte a lo printfque introduce algunas variaciones más interesantes.
tripleee
3

El mecanismo a continuación ayuda a redirigir varias líneas al archivo. Mantener cadena completa bajo "para que podamos redirigir los valores de la variable.

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

Contenido de a.txtis

line 1, 2.6.39
line 2,

Contenido de b.txtis

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