Eu preciso escrever algum xml complexo para uma variável dentro de um script bash. O xml precisa ser legível dentro do script bash, pois é onde o fragmento xml ficará, não está sendo lido de outro arquivo ou fonte.
Então, minha pergunta é: se eu tiver uma longa string que eu quero que seja legível por humanos dentro do meu script bash, qual é a melhor maneira de fazer isso?
Idealmente eu quero:
- para não ter que escapar de nenhum dos personagens
- faça com que ele quebre várias linhas, tornando-o legível por humanos
- mantenha o recuo
Isso pode ser feito com EOF ou algo assim, alguém poderia me dar um exemplo?
por exemplo
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
Isso colocará seu texto em sua variável sem precisar escapar das aspas. Ele também irá lidar com aspas não balanceadas (apóstrofos, ou seja,
'
). Colocar aspas ao redor do sentinela (EOF) evita que o texto sofra expansão de parâmetros. O-d''
faz com que ele leia várias linhas (ignore novas linhas).read
é um Bash embutido, portanto, não requer chamar um comando externo, comocat
.Você esteve quase lá. Ou você usa cat para a montagem de sua string ou cita a string inteira (nesse caso, você teria que escapar das aspas dentro de sua string):
Isso deve funcionar bem no ambiente do shell Bourne
Mais uma forma de fazer o mesmo...
Eu gosto de usar variáveis e especiais
<<-
que descartam a tabulação no início de cada linha para permitir o recuo do script:aviso : não há espaço em branco antes ,
Algumas explicações:eof
mas apenas tabulação ."${Pattern[*]}"
converte esse array em uma string.IFS=";"
porque não há;
strings obrigatóriaswhile IFS=";" read file ...
evitaIFS
ser modificada para o resto do script. Neste,read
use apenas o modificadoIFS
.Existem muitos casos de canto em muitas das outras respostas.
Para ter certeza absoluta de que não há problemas com espaços, tabulações, IFS etc., uma abordagem melhor é usar a construção "heredoc", mas codificar o conteúdo do heredoc usando
uuencode
conforme explicado aqui:https://stackoverflow.com/questions/6896025/#11379627 .