Le script shell fait écho à la nouvelle ligne du fichier

26

Je veux faire écho à une nouvelle ligne dans un fichier entre des variables dans un script shell. Voici mon code:

var1 = "Bonjour"
var2 = "Monde!"
logwrite = "$ var1 [Voici où je veux insérer une nouvelle ligne] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

En ce moment, lorsque j'exécute mon script, le fichier user.txt montre ceci:

Bonjour le monde!

Je veux qu'il montre:

Bonjour
Monde!

Comment puis-je faire cela??

EDIT: Voici mon script shell:

echo -n "Quel est votre prénom?"
lire d'abord
echo -n "Quel est votre nom de famille?"
lire en dernier
echo -n "Quel est votre deuxième prénom?"
lire au milieu
echo -n "Quel est votre anniversaire?"
lire l'anniversaire
echo -e "Prénom: $ premier / nNom: $ dernier / nNom moyen: $ middle / nAnniversaire: $ anniversaire" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
daviesgeek
la source
1
DEVEZ-VOUS créer cette variable "logwrite"? Pouvez-vous écrire printf "%s\n" $var1 $var2 >> file?
glenn jackman le
Non, je n'en ai pas besoin et dans mon script révisé sur lequel je travaille, je n'utilise pas la variable $ logwrite. Merci.
daviesgeek

Réponses:

32
var1="Hello"
var2="World!"
logwrite="$var1\n$var2"
echo -e "$logwrite"  >> /Users/username/Desktop/user.txt

Explication:

La \nséquence d'échappement indique un saut de ligne. Passer l' -eargument à l'écho permet d'interpréter les séquences d'échappement.

Il peut même être encore simplifié:

var1="Hello"
var2="World!"
echo -e "$var1\n$var2"  >> /Users/username/Desktop/user.txt

ou même:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
John T
la source
Votre exemple fonctionne, mais lorsque je l'intègre dans mon code, cela ne fonctionne pas. Je vais modifier mon article et y ajouter mon script.
daviesgeek
1
@dave, il semble que vous utilisez la mauvaise barre oblique avec la séquence d'échappement. \nau lieu de /ndevrait faire l'affaire :)
John T
Cela le corrige (en utilisant \ n au lieu de / n. Merci beaucoup !!
daviesgeek
@dave vous êtes plus que bienvenus :)
John T
sur AIX dans le script KSH, je n'avais pas besoin du -edrapeau.
javaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

ou en fait vous n'avez pas besoin de vars:

echo 'Hello' >> /Users/username/Desktop/user.txt
echo 'World!' >> /Users/username/Desktop/user.txt

il y a un problème avec john t answer: si l'un des vars avait la chaîne \ n (ou une autre séquence comme \ t) ils seront traduits. on peut obtenir quelque chose de similaire à sa réponse avec printf:

printf '%s\n%s\n' 'Hello' 'World!'

aussi hmm. je vois que vous composez la réponse dans une variable $ logwrite. si c'est la seule utilisation de cette variable, cela semble inutile.

Je pense qu'un document ici pourrait être plus lisible, surtout si vous avez beaucoup de lignes à ajouter au journal:

cat >> /Users/username/Desktop/user.txt <<EOF
Hello
World
EOF

(ce mot, EOF, est un délimiteur que vous pouvez choisir. il peut s'agir de n'importe quel mot).

méfiez-vous que l'hérédoc étendra les variables $, comme les guillemets doubles. si vous ne voulez pas cela, vous citez l'hérédoc, comme << "EOF"

elias
la source
la chose est qu'aucun des vars ont \n, d'où la raison pour laquelle j'ai fourni la réponse. La méthodologie «et si» transportait chaque question de ce site dans une discussion sans fin. Quand il arrive sur cette route, il peut poser une autre question :)
John T
@elias, la variable $ logwrite était restée de mes modifications sur le script pendant que j'apportais des modifications. J'ai retiré la var $ logwrite de mon code. La réponse de John T. a effectivement fonctionné. Merci beaucoup!
daviesgeek
Oui, utilisez printf. C'est POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件