Eu preciso escrever um 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 em outro arquivo ou fonte.
Então, minha pergunta é: se eu tiver uma longa string que eu queira ser 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
- tê-lo atravessar 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
Respostas:
Isso colocará seu texto em sua variável sem precisar escapar das aspas. Ele também manipulará aspas desequilibradas (apóstrofos, ie
'
). Colocar aspas no sentinela (EOF) impede que o texto sofra expansão de parâmetros. As-d''
causas para ler várias linhas (ignorar novas linhas).read
é um Bash embutido, portanto não requer a chamada de um comando externo, comocat
.fonte
cat
.cat
é um comando externo. Não usá-lo economiza fazendo isso. Além disso, alguns têm a filosofia de que se você estiver usando gato com menos de dois argumentos "Você está fazendo errado" (que é diferente de "uso inútil decat
").set -e
. Pareceread
sempre retornar diferente de zero. Você pode grossa esse comportamento usando! read -d .......
String
variável de várias linhas para gravar em um arquivo, coloque a variável em torno de "QUOTES" comoecho "${String}" > /tmp/multiline_file.txt
ouecho "${String}" | tee /tmp/multiline_file.txt
. Levei mais de uma hora para encontrar isso.Você já esteve quase lá. Você usa cat para a montagem da sua string ou cita a string inteira (nesse caso, você teria que escapar das aspas dentro da string):
fonte
'EOF'
ou"EOF"
, caso contrário, as variáveis do shell serão analisadas.Isso deve funcionar bem no ambiente de shell Bourne
fonte
Mais uma maneira de fazer o mesmo ...
Eu gosto de usar variáveis e especiais
<<-
que eliminam 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[*]}"
lança esse array em uma string.IFS=";"
porque não há;
nas strings necessáriaswhile IFS=";" read file ...
impedeIFS
que seja modificado para o restante do script. Neste,read
use apenas o modificadoIFS
.fonte
mapfile
requer o Bash 4 ou superior. E a sintaxe"${Pattern[*]}"
lança a matriz em uma cadeia de caracteres quando estiver entre aspas (como mostrado no código de exemplo).Existem muitos casos de canto em muitas das outras respostas.
Para ter certeza absoluta de que não há problemas com espaços, guias, IFS etc., uma abordagem melhor é usar a construção "heredoc", mas codifique o conteúdo do heredoc usando
uuencode
o explicado aqui:https://stackoverflow.com/questions/6896025/#11379627 .
fonte