Skrypt powłoki echa nowej linii do pliku

26

Chcę powtórzyć nową linię do pliku pomiędzy zmiennymi w skrypcie powłoki. Oto mój kod:

var1 = „Witaj”
var2 = „Świat!”
logwrite = "$ var1 [Tutaj chcę wstawić nowy wiersz] $ var2
echo „$ logwrite” >> /Users/username/Desktop/user.txt

W tej chwili po uruchomieniu skryptu plik user.txt pokazuje to:

Witaj świecie!

Chcę, aby pokazywał:

Witaj
Świat!

Jak mam to zrobic??

EDYCJA: Oto mój skrypt powłoki:

echo -n "Jak masz na imię?"
najpierw przeczytaj
echo -n "Jak masz na nazwisko?"
przeczytaj ostatni
echo -n "Jakie jest twoje drugie imię?"
czytaj w środku
echo -n "Jakie są twoje urodziny?"
czytaj urodziny
echo -e "Imię: $ pierwsze / n Ostatnie imię: $ ostatnie / nŚrednie imię: $ middle / nBirthday: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
daviesgeek
źródło
1
Czy musisz utworzyć tę zmienną „logwrite”? Można napisać printf "%s\n" $var1 $var2 >> file?
glenn jackman
Nie, nie muszę i w zmienionym skrypcie, nad którym pracowałem, nie używam zmiennej $ logwrite. Dzięki.
daviesgeek

Odpowiedzi:

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

Wyjaśnienie:

\nSekwencja ucieczki sygnalizuje karetki. Przekazanie -eargumentu do echa umożliwia interpretację sekwencji specjalnych.

Można to jeszcze bardziej uprościć:

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

lub nawet:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
John T.
źródło
Twój przykład działa, ale kiedy włączę go do mojego kodu, nie działa. Zedytuję swój post i dodam do niego skrypt.
daviesgeek
1
@dave wygląda na to, że używasz niewłaściwego ukośnika w sekwencji ucieczki. \nzamiast /nzrobić lewę :)
John T
To naprawia (używając \ n zamiast / n. Bardzo dziękuję !!
daviesgeek
@dave jesteś bardzo mile widziany :)
John T
w systemie AIX w skrypcie KSH nie wymagałem -eflagi.
javaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

lub faktycznie nie potrzebujesz varsów:

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

istnieje problem z odpowiedzią na pytanie: jeśli którykolwiek z vars miał ciąg \ n (lub inną sekwencję, taką jak \ t), zostaną one przetłumaczone. z printf można uzyskać coś podobnego do jego odpowiedzi:

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

także hmm. widzę, że komponujesz odpowiedź na zmienną $ logwrite. jeśli jest to jedyne zastosowanie tej zmiennej, wydaje się bezcelowe.

Myślę, że dokument tutaj może być bardziej czytelny, szczególnie jeśli masz dużo linii do dołączenia do dziennika:

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

(to słowo, EOF, jest ogranicznikiem, który możesz wybrać. może to być dowolne słowo).

uważaj, że heredoc rozwinie zmienne $, takie jak podwójne cudzysłowy. jeśli nie chcesz tego, cytujesz heredoc, np. << „EOF”

elias
źródło
Chodzi o to, że żaden z nich nie ma \n, dlatego udzieliłem odpowiedzi. Metodologia „co jeśli” prowadziłaby każde pytanie na tej stronie do niekończącej się dyskusji. Gdy dojdzie do tej drogi, może zadać kolejne pytanie :)
John T
@elias Zmienna $ logwrite pozostała po moich edycjach skryptu podczas wprowadzania zmian. Wyjąłem zmienną $ logwrite var z mojego kodu. Odpowiedź Johna T. faktycznie zadziałała. Dzięki wielkie!
daviesgeek
Tak, użyj printf. Jest POSIX: stackoverflow.com/a/34947759/895245
Ciro Santilli 23 改造 中心 法轮功 六四 事件