El cat <<EOF
La sintaxis es muy útil cuando se trabaja con texto de varias líneas en Bash, p. al asignar una cadena de varias líneas a una variable de shell, un archivo o una tubería.
Ejemplos de cat <<EOF
uso de sintaxis en Bash:
1. Asigne una cadena de varias líneas a una variable de shell
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)
El $sql
La variable ahora también contiene los caracteres de nueva línea. Puedes verificar con echo -e "$sql"
.
2. Pase una cadena de varias líneas a un archivo en Bash
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
El print.sh
el archivo ahora contiene:
#!/bin/bash
echo $PWD
echo /home/user
3. Pase una cadena multilínea a una tubería en Bash
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF
El b.txt
el archivo contiene bar
y baz
líneas. La misma salida se imprime en stdout
.
Esto se llama heredoc formato para proporcionar una cadena en stdin. Consulte https://en.wikipedia.org/wiki/Here_document#Unix_shells para obtener más detalles.
Desde man bash
:
Aquí Documentos
Este tipo de redirección indica al shell que lea la entrada de la fuente actual hasta que se vea una línea que contenga solo una palabra (sin espacios en blanco al final).
Todas las líneas leídas hasta ese punto se utilizan como entrada estándar para un comando.
El formato de los documentos aquí es:
<<[-]word
here-document
delimiter
No se realiza ninguna expansión de parámetros, sustitución de comandos, expansión aritmética o expansión de nombre de ruta en palabra . Si algún carácter en palabra arequoted, el delimitador es el resultado de la eliminación de comillas en palabra y las líneas en el aquí-documento no se expanden. Si palabra no está entre comillas, todas las líneas del aquí-documento están sujetos a expansión de parámetros, sustitución de comandos y expansión aritmética. En este último caso, la secuencia de caracteres \<newline>
se ignora y \
debe usarse para citar los caracteres \
, $
y `
.
Si el operador de redirección es <<-
, todos los caracteres de tabulación iniciales se eliminan de las líneas de entrada y la línea que contiene delimitador . Esto permite que los documentos aquí dentro de los scripts de shell tengan una sangría natural.
En su caso, "EOF" se conoce como "Etiqueta aquí". Básicamente <<Here
le dice al shell que va a ingresar una cadena de varias líneas hasta la "etiqueta" Here
. Puede nombrar esta etiqueta como desee, a menudo es EOF
o STOP
.
Algunas reglas sobre las etiquetas Aquí:
- La etiqueta puede ser cualquier cadena, en mayúsculas o minúsculas, aunque la mayoría de la gente usa mayúsculas por convención.
- La etiqueta no se considerará como una etiqueta Aquí si hay otras palabras en esa línea. En este caso, simplemente se considerará parte de la cadena. La etiqueta debe estar sola en una línea separada, para que se considere una etiqueta.
- La etiqueta no debe tener espacios iniciales ni finales en esa línea para que se considere una etiqueta. De lo contrario, se considerará como parte de la cadena.
ejemplo:
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string