Multi-ligne de chaîne avec de l'espace supplémentaire (conservé de traces)
J'ai envie d'écrire quelques textes prédéfinis dans un fichier avec le texte suivant:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
Je m'attends à quelque chose comme ceci:
this is line one
this is line two
this is line three
Mais j'ai reçu ceci:
this is line one
this is line two
this is line three
Je suis positif qu'il n'y a pas d'espace après chaque \n
, mais comment l'espace supplémentaire en sortir?
- Je ne suis pas sûr mais.. comment si vous venez de taper
text="this is line one\nthis is line two\nthis is line three"
dans la même ligne..? (sans entrée) - Supprimer la
\n
sur chaque ligne, vous avez déjà atteint plus de saut de ligne pour passer à la nouvelle ligne - Vous avez déjà donné
\n
.Alors, pourquoi vous mettre la ligne suivante dans la nouvelle ligne? Simplementtext="this is line one\nthis is line two\nthis is line three"
- Retrait de la
\n
à la fin de chaque ligne provoque la sortie de tous les exécuter ensemble sur une seule ligne. - Aha: Mettre des guillemets autour de la
"$text"
dans l'écho de la ligne est cruciale. Sans eux, aucun des retours à la ligne (à la fois littéral et '\n') de travail. Avec eux, ils le font tous.
Vous devez vous connecter pour publier un commentaire.
Heredoc sons plus pratique pour ce but. Il est utilisé pour envoyer plusieurs commandes à un interpréteur de commande de programme comme ex ou chat
La chaîne après
<<
indique l'endroit où s'arrêter.Pour envoyer ces lignes dans un fichier, utilisez:
Vous pouvez également stocker ces lignes à une variable:
Il stocke les lignes de la variable nommée
VAR
.Lors de l'impression, n'oubliez pas les guillemets autour de la variable sinon vous ne verrez pas les caractères de saut de ligne.
Mieux encore, vous pouvez utiliser l'indentation pour le faire ressortir dans votre code. Cette fois, il suffit d'ajouter une
-
après<<
pour arrêter les onglets apparaissent.Mais alors vous devez utiliser les onglets, pas des espaces pour l'indentation dans votre code.
-d
option dansread -r -d '' VARIABLE <<- EOM
ne fonctionne pas pour moi.It is used to send multiple commands to a command interpreter program like ex or cat
" Comment estcat
un interpréteur de commande de programme?\$
pour imprimer le texte.ambiguous redirect
quand je suis en utilisantcat > $FILE <<- EOM...EOM
. Quelqu'un sait pourquoi?Si vous essayez d'obtenir la chaîne de caractères dans une variable, un autre moyen facile est quelque chose comme ceci:
Si vous voulez votre chaîne, avec des onglets (c'est à dire, '\t'), l'indentation sera supprimés. Si vous mettre en retrait avec des espaces, l'indentation sera laissé dans.
REMARQUE: Il est significatif que la dernière parenthèse fermante est sur une autre ligne. Le
END
texte doit apparaître sur une ligne par lui-même.)
sur la même ligne. Je pense que c'est parce que ce qui se passe entre$(
et)
va exécuter dans son propre univers, et la commande de ne pas voir") " de toute façon. Je me demande si ça fonctionne pour les autres aussi.<<-END
style. Exécutershellcheck
à l'encontre de votre script pour voir si elle a des taches de tous les problèmes.echo
ajoute des espaces entre les arguments transmis.$text
est soumise à l'expansion des variables et de couper un mot, de sorte que votreecho
commande est équivalente à:Vous pouvez voir que l'espace est ajouté avant "ce". Vous pouvez soit supprimer les caractères de saut de ligne, et de citer
$text
pour conserver les retours à la ligne:Ou vous pouvez utiliser
printf
, qui est plus robuste et portable que lesecho
:Dans
bash
, qui prend en charge attelle d'extension, vous pourriez même faire:dans un script bash, les travaux suivants:
sinon:
chat nom de fichier donne:
J'ai trouvé plus de solutions car je voulais avoir chaque ligne correctement en retrait:
Vous pouvez utiliser
echo
:Il ne fonctionne pas si vous mettez
"\n"
juste avant\
sur la fin d'une ligne.Alternativement, vous pouvez utiliser
printf
pour une meilleure portabilité (il m'est arrivé d'avoir beaucoup de problèmes avececho
):Encore une autre solution pourrait être:
ou
Une autre solution est obtenue par le mélange de
printf
etsed
.Il n'est pas facile de refactoriser le code formaté comme ceci comme vous le coder en dur le niveau d'indentation dans le code.
Il est possible d'utiliser une fonction d'assistance et une substitution de variables astuces:
Ce qui suit est mon moyen préféré pour attribuer un multi-ligne de chaîne à une variable (je crois que c'est joli).
Le nombre de traits de soulignement est le même (ici 80) dans les deux cas.
il ne fonctionnera que si vous le mettez comme ci-dessous: