Je veux écrire des textes prédéfinis dans un fichier avec les éléments suivants:
text="this is line one\n
this is line two\n
this is line three"
echo -e $text > filename
J'attends quelque chose comme ça:
this is line one
this is line two
this is line three
Mais j'ai ceci:
this is line one
this is line two
this is line three
Je suis certain qu'il n'y a pas d'espace après chacun \n
, mais comment l'espace supplémentaire sort-il?
text="this is line one\nthis is line two\nthis is line three"
la même ligne ..? (sans aucune entrée)\n
sur chaque ligne, vous avez déjà appuyé sur la nouvelle ligne pour passer à la nouvelle ligne\n
. Alors pourquoi mettre la ligne suivante dans une nouvelle ligne? Simplementtext="this is line one\nthis is line two\nthis is line three"
\n
à la fin de chaque ligne entraîne l'exécution de la sortie sur une seule ligne."$text"
de la ligne d'écho est crucial. Sans eux, aucune des nouvelles lignes (à la fois littérales et «\ n») ne fonctionne. Avec eux, ils le font tous.Réponses:
Heredoc semble plus pratique à cet effet. Il est utilisé pour envoyer plusieurs commandes à un programme interpréteur de commandes comme ex ou cat
La chaîne après
<<
indique où s'arrêter.Pour envoyer ces lignes vers un fichier, utilisez:
Vous pouvez également stocker ces lignes dans une variable:
Cela stocke les lignes dans 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 nouvelle ligne.
Encore mieux, vous pouvez utiliser l'indentation pour le faire ressortir davantage dans votre code. Cette fois, ajoutez simplement un
-
après<<
pour empêcher les onglets d'apparaître.Mais alors vous devez utiliser des tabulations, pas des espaces, pour l'indentation dans votre code.
la source
-d
option dansread -r -d '' VARIABLE <<- EOM
n'a pas fonctionné pour moi.Si vous essayez de placer la chaîne dans une variable, un autre moyen simple est quelque chose comme ceci:
Si vous indentez votre chaîne avec des tabulations (c'est-à-dire «\ t»), l'indentation sera supprimée. Si vous indentez avec des espaces, l'indentation sera conservée.
REMARQUE: il est significatif que la dernière parenthèse fermante se trouve sur une autre ligne. Le
END
texte doit apparaître seul sur une ligne.la source
)
sur la même ligne. Je pense que c'est parce que ce qui se passe entre$(
et)
va s'exécuter dans son propre univers, et la commande actuelle ne verra pas ')' de toute façon. Je me demande si ça marche aussi pour les autres.echo
ajoute des espaces entre les arguments qui lui sont passés.$text
est soumis à une expansion variable et à une division des mots, donc votreecho
commande équivaut à:Vous pouvez voir qu'un espace sera ajouté avant "ceci". Vous pouvez soit supprimer les caractères de nouvelle ligne, soit citer
$text
pour conserver les nouvelles lignes:Ou vous pourriez utiliser
printf
, qui est plus robuste et portable queecho
:Dans
bash
, qui prend en charge l'expansion de l'accolade, vous pouvez même faire:la source
dans un script bash, les travaux suivants:
alternativement:
nom de fichier cat donne:
la source
-e
option pourecho
. Veuillez réessayer.J'ai trouvé plus de solutions depuis que je voulais que chaque ligne soit correctement en retrait:
Vous pouvez utiliser
echo
:Cela ne fonctionne pas si vous mettez
"\n"
juste avant\
la fin d'une ligne.Alternativement, vous pouvez utiliser
printf
pour une meilleure portabilité (j'ai eu beaucoup de problèmes avececho
):Une autre solution pourrait être:
ou
Une autre solution est obtenue en mélangeant
printf
etsed
.Il n'est pas facile de refactoriser le code formaté comme ceci lorsque vous codez en dur le niveau d'indentation dans le code.
Il est possible d'utiliser une fonction d'assistance et quelques astuces de substitution de variables:
la source
Ce qui suit est ma façon préférée d'assigner une chaîne multi-lignes à une variable (je pense que ça a l'air bien).
Le nombre de soulignements est le même (ici 80) dans les deux cas.
la source
Juste pour mentionner une simple concaténation d'une ligne car elle peut parfois être utile.
Vous obtiendrez quelque chose comme ça
Tous les espaces blancs de début et de fin seront conservés pour
la source
Il y a plusieurs façons de procéder. Pour moi, canaliser la chaîne en retrait dans sed fonctionne bien.
Cette réponse était basée sur la réponse de Mateusz Piotrowski mais raffinée un peu.
la source
cela fonctionnera si vous le mettez comme ci-dessous:
la source