J'ai besoin d'écrire du XML complexe à une variable dans un script bash. Le xml doit être lisible dans le script bash car c'est là que le fragment xml vivra, il n'est pas lu à partir d'un autre fichier ou d'une autre source.
Ma question est donc la suivante: quelle est la meilleure façon de s'y prendre si j'ai une longue chaîne que je veux être lisible par l'homme dans mon script bash?
Idéalement je veux:
- ne pas avoir à échapper à aucun des personnages
- le faire traverser plusieurs lignes le rendant lisible par l'homme
- garder c'est l'indentation
Est-ce que ceci peut être fait avec EOF ou quelque chose, quelqu'un pourrait-il me donner un exemple?
par exemple
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
Réponses:
Cela mettra votre texte dans votre variable sans avoir besoin d'échapper aux guillemets. Il traitera également les citations non équilibrées (apostrophes, c.
'
-à-d.). Mettre des guillemets autour de la sentinelle (EOF) empêche le texte de se développer. Les-d''
causes de ce à lire plusieurs lignes (ignorer les sauts de ligne).read
est un Bash intégré, il n’est donc pas nécessaire d’appeler une commande externe telle quecat
.la source
cat
.cat
est une commande externe. Ne pas l'utiliser enregistre cela. De plus, certains ont la philosophie que si vous utilisez un chat avec moins de deux arguments "Ur doin 'it false" (ce qui est distinct de "l'utilisation inutile decat
").set -e
. Il sembleread
toujours revenir non nul. Vous pouvez! read -d .......
String
variable multiligne pour écrire dans un fichier, mettez la variable autour de "QUOTES", commeecho "${String}" > /tmp/multiline_file.txt
ouecho "${String}" | tee /tmp/multiline_file.txt
. Cela m'a pris plus d'une heure pour le trouver.Vous avez été presque là. Soit vous utilisez cat pour l'assemblage de votre chaîne, soit vous citez la chaîne entière (dans ce cas, vous devez échapper aux guillemets à l'intérieur de votre chaîne):
la source
'EOF'
ou"EOF"
, sinon les variables du shell seront analysées.Cela devrait fonctionner correctement dans l'environnement Bourne Shell
la source
Encore une autre façon de faire la même chose ...
J'aime utiliser des variables et des caractères spéciaux
<<-
qui suppriment la tabulation au début de chaque ligne pour permettre l'indentation du script:attention : il n’ya pas d’ espace vide avant
Quelques explications:eof
mais seulement de la tabulation ."${Pattern[*]}"
transforme ce tableau en chaîne.IFS=";"
parce qu'il n'y a pas;
de chaînes obligatoireswhile IFS=";" read file ...
empêcheIFS
d'être modifié pour le reste du script. En cela,read
utilisez uniquement le modifiéIFS
.la source
mapfile
nécessite Bash 4 ou supérieur. Et la syntaxe"${Pattern[*]}"
convertit le tableau en chaîne entre guillemets (comme indiqué dans l'exemple de code).Il y a trop de cas dans de nombreuses autres réponses.
Pour être absolument sûr qu'il n'y a pas de problèmes d'espaces, de tabulations, d'IFS, etc., une meilleure approche consiste à utiliser la construction "heredoc", mais à coder le contenu de l'hérédoc en utilisant
uuencode
comme expliqué ici:https://stackoverflow.com/questions/6896025/#11379627 .
la source