Script shell menggemakan baris baru ke file

26

Saya ingin mengulangi baris baru ke file di antara variabel dalam skrip shell. Ini kode saya:

var1 = "Halo"
var2 = "Dunia!"
logwrite = "$ var1 [Di sinilah saya ingin menyisipkan baris baru] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

Saat ini, ketika saya menjalankan skrip saya, file user.txt menunjukkan ini:

Halo Dunia!

Saya ingin menunjukkan:

Halo
Dunia!

Bagaimana saya melakukan ini ??

EDIT: Ini skrip shell saya:

echo -n "Siapa nama depan Anda?"
baca dulu
echo -n "Siapa nama belakangmu?"
baca yang terakhir
echo -n "Apa nama tengah Anda?"
baca tengah
echo -n "Apa hari ulang tahunmu?"
baca ulang tahun
echo -e "Nama Depan: $ first / nNama Terakhir: $ last / nNama Tengah: $ middle / nBirthday: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
daviesgeek
sumber
1
Apakah Anda PERLU membuat variabel "logwrite" ini? Anda dapat menulis printf "%s\n" $var1 $var2 >> file?
glenn jackman
Tidak, saya tidak perlu dan dalam skrip revisi saya yang telah saya kerjakan, saya tidak menggunakan variabel $ logwrite. Terima kasih.
daviesgeek

Jawaban:

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

Penjelasan:

The \nUrutan escape menunjukkan feed line. Melewati -eargumen ke echo memungkinkan interpretasi dari urutan escape.

Itu bahkan dapat disederhanakan lebih lanjut:

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

atau bahkan:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
John T
sumber
Contoh Anda berfungsi, tetapi ketika saya memasukkannya ke dalam kode saya, itu tidak berfungsi. Saya akan mengedit posting saya dan menambahkan skrip saya di dalamnya.
daviesgeek
1
@tampakkan bahwa Anda menggunakan tebasan yang salah dengan urutan pelarian. \nalih-alih /nharus melakukan trik :)
John T
Itu memperbaikinya (menggunakan \ n bukan / n. Terima kasih banyak !!
daviesgeek
@ jangan terima kasih lagi :)
John T
pada AIX dalam skrip KSH saya tidak memerlukan -ebendera.
javaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

atau sebenarnya Anda tidak perlu vars:

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

ada masalah dengan john t answer: jika ada var yang memiliki string \ n (atau urutan lain seperti \ t) mereka akan diterjemahkan. orang bisa mendapatkan sesuatu yang mirip dengan jawabannya dengan printf:

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

juga hmm. saya melihat Anda menulis jawabannya menjadi variabel $ logwrite. jika ini adalah satu-satunya penggunaan variabel ini, tampaknya tidak ada gunanya.

Saya pikir di sini-doc bisa lebih mudah dibaca, khususnya jika Anda memiliki banyak baris untuk ditambahkan ke log:

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

(kata ini, EOF, adalah pembatas yang dapat Anda pilih. bisa berupa kata apa saja).

Waspadalah bahwa heredoc akan memperluas $ variabel, seperti tanda kutip ganda. jika Anda tidak menginginkan ini, Anda mengutip heredoc, seperti << "EOF"

elias
sumber
masalahnya tidak ada vars miliki \n, maka mengapa saya memberikan jawabannya. Metodologi "bagaimana jika" akan membawa setiap pertanyaan di situs ini menjadi diskusi tanpa akhir. Ketika dia datang ke jalan itu, dia dapat mengajukan pertanyaan lain :)
John T
@elias variabel $ logwrite masih tersisa dari suntingan saya pada skrip saat saya membuat perubahan. Saya mengambil $ logwrite var dari kode saya. Jawaban John T. benar-benar berhasil. Terima kasih banyak!
daviesgeek
Ya, gunakan printf. Ini POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli 改造 改造 中心 法轮功 六四 事件