Necesito escribir algunos xml complejos en una variable dentro de un script bash. El xml debe ser legible dentro del script bash ya que aquí es donde vivirá el fragmento xml, no se está leyendo desde otro archivo o fuente.
Entonces, mi pregunta es esta: si tengo una cadena larga que quiero que sea legible para los humanos dentro de mi script bash, ¿cuál es la mejor manera de hacerlo?
Idealmente quiero:
- no tener que escapar de ninguno de los personajes
- hacer que se rompa en varias líneas haciéndolo legible
- mantener su sangría
¿Se puede hacer esto con EOF o algo así, alguien podría darme un ejemplo?
p.ej
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
Respuestas:
Esto colocará su texto en su variable sin necesidad de escapar de las comillas. También manejará comillas desequilibradas (apóstrofes, es decir
'
). Poner comillas alrededor del centinela (EOF) evita que el texto sufra expansión de parámetros. Esto-d''
hace que lea varias líneas (ignore las nuevas líneas).read
es un Bash incorporado, por lo que no requiere llamar a un comando externo comocat
.fuente
cat
.cat
Es un comando externo. No usarlo ahorra haciendo eso. Además, algunos tienen la filosofía de que si está usando gato con menos de dos argumentos "Ur lo está haciendo mal" (que es distinto del "uso inútil decat
").set -e
. Parece queread
siempre devuelve un valor distinto de cero. Puede! read -d .......
String
variable de varias líneas para escribir en un archivo, coloque la variable alrededor de "COTIZACIONES" comoecho "${String}" > /tmp/multiline_file.txt
oecho "${String}" | tee /tmp/multiline_file.txt
. Me llevó más de una hora encontrar eso.Ya casi has estado allí. O usa cat para el ensamblaje de su cadena o cita la cadena completa (en cuyo caso, tendría que escapar de las comillas dentro de su cadena):
fuente
'EOF'
o"EOF"
, de lo contrario, se analizarán las variables de shell.Esto debería funcionar bien en el entorno de shell Bourne
fuente
Otra forma de hacer lo mismo ...
Me gusta usar variables y especiales
<<-
que eliminan la tabulación al comienzo de cada línea para permitir la sangría del script:advertencia : no hay espacio en blanco antes,
Algunas explicaciones:eof
sino solo tabulación ."${Pattern[*]}"
convierte esta matriz en una cadena.IFS=";"
porque no hay;
cadenas requeridaswhile IFS=";" read file ...
evitaIFS
que se modifique el resto del script. En esto, soloread
use el modificadoIFS
.fuente
mapfile
requiere Bash 4 o superior. Y la sintaxis"${Pattern[*]}"
convierte la matriz en una cadena cuando está entre comillas (como se muestra en el código de ejemplo).Hay demasiados casos de esquina en muchas de las otras respuestas.
Para estar absolutamente seguro de que no hay problemas con espacios, pestañas, IFS, etc., un mejor enfoque es usar el constructo "heredoc", pero codificar el contenido del heredoc usando
uuencode
como se explica aquí:https://stackoverflow.com/questions/6896025/#11379627 .
fuente