Сценарий оболочки отображает новую строку в файле

26

Я хочу отобразить новую строку в файле между переменными в сценарии оболочки. Вот мой код:

var1 = "Hello"
var2 = "Мир!"
logwrite = "$ var1 [Здесь я хочу вставить новую строку] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

Прямо сейчас, когда я запускаю свой скрипт, файл user.txt показывает это:

Привет, мир!

Я хочу это показать:

Здравствуйте
Мир!

Как мне это сделать??

РЕДАКТИРОВАТЬ: Вот мой сценарий оболочки:

echo -n "Как тебя зовут?"
читать первым
echo -n "Какая у тебя фамилия?"
читать в последний раз
echo -n "Каково ваше второе имя?"
читать середину
echo -n "Какой у тебя день рождения?"
читать день рождения
echo -e "Имя: $ first / nLast Имя: $ last / nMiddle Имя: $ middle / nBirthday: $ birthday" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"
daviesgeek
источник
1
Вам нужно создать эту переменную logwrite? Ты умеешь писать printf "%s\n" $var1 $var2 >> file?
Гленн Джекман
Нет, мне не нужно, и в моем пересмотренном сценарии, над которым я работал, я не использую переменную $ logwrite. Спасибо.
daviesgeek

Ответы:

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

Объяснение:

\nПоследовательность выхода указывает на новую строку. Передача -eаргумента в echo позволяет интерпретировать escape-последовательности.

Это может даже быть упрощено далее:

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

или даже:

echo -e "Hello\nWorld! "  >> /Users/username/Desktop/user.txt
Джон Т
источник
Ваш пример работает, но когда я включаю его в свой код, он не работает. Я отредактирую свой пост и добавлю в него свой скрипт.
daviesgeek
1
@ dave, похоже, вы используете неправильную косую черту с escape-последовательностью. \nвместо того, /nчтобы делать трюк :)
Джон Т
Это исправляет (используя \ n вместо / n. Большое спасибо !!
daviesgeek
@ dave, вы более чем приветствуем :)
Джон Т
на AIX в скрипте KSH мне -eфлаг не требовался .
javaPlease42
5
var1='Hello'
var2='World!'
echo "$var1" >> /Users/username/Desktop/user.txt
echo "$var2" >> /Users/username/Desktop/user.txt

или на самом деле вам не нужны переменные:

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

Существует проблема с john t answer: если у какого-либо из vars есть строка \ n (или какая-либо другая последовательность, например, \ t), они будут переведены. что-то похожее на его ответ можно получить с помощью printf:

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

тоже хм. я вижу, вы составляете ответ в переменную $ logwrite. если это единственное использование этой переменной, это кажется бессмысленным.

Я думаю, что здесь документ может быть более читабельным, особенно если у вас есть много строк, чтобы добавить в журнал:

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

(это слово EOF - это разделитель, который вы можете выбрать. Это может быть любое слово).

Имейте в виду, что heredoc будет расширять переменные $, как двойные кавычки. если вы не хотите этого, вы цитируете heredoc, например << "EOF"

Элиас
источник
Дело в том, что ни один из вариантов не имеет \n, поэтому я и дал ответ. Методология «что если» перенесет каждый вопрос на этом сайте в бесконечную дискуссию. Когда он выходит на эту дорогу, он может задать еще один вопрос :)
Джон Т
@elias переменная $ logwrite осталась от моих правок в скрипте, когда я вносил изменения. Я взял переменную $ logwrite из моего кода. Ответ Джона Т. действительно сработал. Спасибо!
daviesgeek
Да, используйте printf. Это POSIX: stackoverflow.com/a/34947759/895245
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件