Shell script ecoar nova linha para arquivo


26

Eu quero ecoar uma nova linha para um arquivo entre variáveis ​​em um script de shell. Aqui está o meu código:

var1 = "Olá"
var2 = "Mundo!"
logwrite = "$ var1 [Aqui é onde eu quero inserir uma nova linha] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

No momento, quando executo meu script, o arquivo user.txt mostra isso:

Olá Mundo!

Eu quero que ele mostre:

Olá
Mundo!

Como eu faço isso??

EDIT: Aqui está o meu script de shell:

echo -n "Qual é o seu primeiro nome?"
leia primeiro
echo -n "Qual é o seu sobrenome?"
leia por último
echo -n "Qual é o seu nome do meio?"
leia meio
echo -n "Qual é o seu aniversário?"
leia aniversário
echo -e "Nome: $ first / nLast Name: $ last / nNome do meio: $ middle / nAniversário: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"

1
Você precisa criar essa variável "logwrite"? Você pode escrever printf "%s\n" $var1 $var2 >> file?
Glenn Jackman

Não, não preciso e, no meu script revisado em que estou trabalhando, não uso a variável $ logwrite. Obrigado.
daviesgeek

Respostas:


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

Explicação:

A \nsequência de escape indica um avanço de linha. Passar o -eargumento para eco permite a interpretação de seqüências de escape.

Pode até ser simplificado ainda mais:

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

ou até:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt

Seu exemplo funciona, mas quando eu o incorporo no meu código, ele não funciona. Vou editar minha postagem e adicionar meu script.
Davidiesgeek

1
@dave parece que você está usando a barra incorreta na sequência de escape. \nem vez de /ndeve fazer o truque :)
John T

Isso resolve o problema (usando \ n em vez de / n Thanks so much !!.
daviesgeek

@ Dave você é mais que bem-vindos :)
John T

no AIX no script KSH, não exigi a -esinalização.
javaPlease42

5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

ou na verdade você não precisa de vars:

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

existe um problema com a resposta john t: se algum dos vars tiver a string \ n (ou alguma outra sequência como \ t), eles serão traduzidos. pode-se obter algo semelhante à sua resposta com printf:

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

também hmm. Vejo que você está compondo a resposta em uma variável $ logwrite. se esse é o único uso dessa variável, parece inútil.

Eu acho que um documento aqui pode ser mais legível, especialmente se você tiver muita linha para acrescentar ao log:

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

(esta palavra, EOF, é um delimitador que você pode escolher. pode ser qualquer palavra).

cuidado para que o heredoc expanda variáveis ​​$, como aspas duplas. se você não quiser isso, cite o heredoc, como << "EOF"


a coisa é que nenhum dos vars tem \n, daí o motivo de eu ter fornecido a resposta. A metodologia "e se" levaria todas as perguntas deste site a uma discussão sem fim. Quando ele vem para esse caminho que ele pode fazer outra pergunta :)
John T

@elias a variável $ logwrite ficou nas minhas edições no script enquanto eu fazia as alterações. Tirei o $ logwrite var do meu código. A resposta de John T. realmente funcionou. Muito obrigado!
daviesgeek

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.