web-dev-qa-db-fra.com

Ajout de caractères de nouvelle ligne aux variables shell Unix

Je suis nouveau dans les scripts Shell. J'ai une variable dans un script shell dans laquelle j'aimerais formater les données. La variable stocke les nouvelles données à chaque itération d'une boucle. Chaque fois que les nouvelles données sont stockées, j'aimerais insérer un nouveau caractère de ligne. Voici comment j'essaie de stocker les données dans la variable.

VARIABLE="$VARIABLE '\n' SomeData"

Malheureusement, la sortie inclut le '\n' littéral. Toute aide serait la bienvenue. Merci d'avance.

30
James P.

Essayez $'\n':

VAR=a
VAR="$VAR"$'\n'b
echo "$VAR"

donne moi

a
b
55
vmpstr

Une technique courante est:

nl='
'
VARIABLE="PreviousData"
VARIABLE="$VARIABLE${nl}SomeData"

echo "$VARIABLE"
PreviousData
SomeData
20
William Pursell
VAR="one"
VAR="$VAR.\n.two"
echo -e $VAR

Sortie:

un. 
.deux

5
Alex

Autre que $'\n', vous pouvez utiliser printf également comme ceci:

VARIABLE="Foo Bar"
VARIABLE=$(printf "${VARIABLE}\nSomeData")
echo "$VARIABLE"

SORTIE:

Foo Bar
SomeData
3
anubhava

C'est beaucoup plus simple que vous ne le pensez:

VARIABLE="$VARIABLE
SomeData"
1
chepner

Guillemet simple Tous les caractères spéciaux entre ces guillemets perdent leur sens spécial.
https://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

Donc, la syntaxe que vous utilisez fait quelque chose de différent que vous voulez réaliser.

Voici ce dont vous avez besoin:

La construction $ '\ X' rend l'option -e in echo inutile . 
https://linux.die.net/abs-guide/escapingsection.html

echo -e "something\nsomething"

ou 

echo "something"$'\n'"something"
1
user8175891

J'ai eu un problème avec toutes les autres solutions: en utilisant un # suivi de SPACE (assez courant lors de l'écriture dans Markdown), les deux se sépareraient sur une nouvelle ligne.

Donc, une autre façon de faire consisterait à utiliser des guillemets simples pour que le "\ n" soit rendu.

FOO=$'# Markdown Title #\n'
BAR=$'Be *brave* and **bold**.'
FOOBAR="$FOO$BAR"

echo "$FOOBAR"

Sortie:

# Markdown Title #
Be *brave* and **bold**.
1
pattulus

En me basant sur les deux premières solutions, j'aimerais voir ce qui suit. La concaténation de chaînes avec l'opérateur '+ =' me semble plus claire.

N'oubliez pas non plus d'utiliser printf plutôt que d'écho, vous éviterez tant de problèmes

sometext="This is the first line"
sometext+=$'\n\n'
sometext+="This is the second line AFTER the inserted new lines"
printf '%s' "${sometext}"

Les sorties:

C'est la première ligne

Ceci est la troisième ligne APRÈS la nouvelle ligne insérée

0
Almendrico