Shell script lặp lại dòng mới vào tập tin


26

Tôi muốn lặp lại một dòng mới vào một tệp ở giữa các biến trong tập lệnh shell. Đây là mã của tôi:

var1 = "Xin chào"
var2 = "Thế giới!"
logwrite = "$ var1 [Đây là nơi tôi muốn chèn một dòng mới] $ var2
tiếng vang "$ logwrite" >> /Users/username/Desktop/user.txt

Ngay bây giờ, khi tôi chạy tập lệnh của mình, tệp user.txt hiển thị điều này:

Chào thế giới!

Tôi muốn nó hiển thị:

xin chào
Thế giới!

Làm thế nào để tôi làm điều này??

EDIT: Đây là kịch bản shell của tôi:

echo -n "Tên của bạn là gì?"
đọc trước
echo -n "Họ của bạn là gì?"
đọc lần cuối
echo -n "Tên đệm của bạn là gì?"
đọc giữa
echo -n "Sinh nhật của bạn là gì?"
đọc sinh nhật
echo -e "Tên: $ First / nLast Tên: $ last / nMiddle Tên: $ middle / nB birthday: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Máy tính để bàn / user.txt"

1
Bạn có CẦN tạo biến "logwrite" này không? Bạn có thể viết printf "%s\n" $var1 $var2 >> filekhông
glenn jackman

Không, tôi không cần và trong kịch bản sửa đổi của mình mà tôi đang làm việc, tôi không sử dụng biến $ logwrite. Cảm ơn.
daviesgeek

Câu trả lời:


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

Giải trình:

Các \ndãy thoát cho thấy thức ăn đường. Truyền -eđối số cho echo cho phép giải thích các chuỗi thoát.

Nó thậm chí có thể được đơn giản hóa hơn nữa:

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

hoặc thậm chí:

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

Ví dụ của bạn hoạt động, nhưng khi tôi kết hợp nó vào mã của mình, nó không hoạt động. Tôi sẽ chỉnh sửa bài viết của mình và thêm tập lệnh của tôi vào đó.
daviesgeek

1
@dave có vẻ như bạn đang sử dụng dấu gạch chéo sai với chuỗi thoát. \nthay vì /nnên thực hiện mánh khóe :)
John T

Điều đó sửa nó (sử dụng \ n thay vì / n. Cảm ơn rất nhiều !!
daviesgeek

@dave bạn được chào đón nhiều hơn :)
John T

trên AIX trong tập lệnh KSH tôi không yêu cầu -ecờ.
javaPlease42

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

hoặc thực sự bạn không cần bình:

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

có một vấn đề với câu trả lời của john t: nếu bất kỳ vars nào có chuỗi \ n (hoặc một số chuỗi khác như \ t) thì chúng sẽ được dịch. người ta có thể nhận được một cái gì đó tương tự như câu trả lời của mình với printf:

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

cũng hmm. tôi thấy bạn đang soạn câu trả lời thành một biến $ logwrite. nếu đây là việc sử dụng duy nhất của biến này, nó dường như vô nghĩa.

Tôi nghĩ rằng một tài liệu ở đây có thể dễ đọc hơn, đặc biệt nếu bạn có nhiều dòng để nối vào nhật ký:

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

(từ này, EOF, là một dấu phân cách bạn có thể chọn. Nó có thể là bất kỳ từ nào).

hãy cẩn thận rằng heredoc sẽ mở rộng các biến $, như dấu ngoặc kép. nếu bạn không muốn điều này, bạn trích dẫn di truyền, như << "EOF"


điều này là không ai trong số các vars có \n, do đó tại sao tôi cung cấp câu trả lời. Phương pháp "nếu như" sẽ mang mọi câu hỏi trên trang web này vào một cuộc thảo luận bất tận. Khi đến con đường đó, anh ta có thể hỏi một câu hỏi khác :)
John T

@elias biến $ logwrite còn sót lại từ các chỉnh sửa của tôi trên tập lệnh khi tôi đang thực hiện các thay đổi. Tôi lấy var $ logwrite ra khỏi mã của mình. Câu trả lời của John T. đã thực sự hoạt động. Cám ơn rất nhiều!
daviesgeek

Có, sử dụng printf. Đó là POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli 心 心
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.