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"

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

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"


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.