Скрипт оболонки повторює новий рядок для подачі


26

Я хочу повторити новий рядок у файлі між змінними в сценарії оболонки. Ось мій код:

var1 = "Привіт"
var2 = "Світ!"
logwrite = "$ var1 [Тут я хочу вставити новий рядок] $ var2
echo "$ logwrite" >> /Users/username/Desktop/user.txt

Зараз під час запуску сценарію файл user.txt показує це:

Привіт Світ!

Я хочу, щоб це показало:

Здравствуйте
Світ!

Як це зробити ??

EDIT: Ось мій сценарій оболонки:

echo -n "Як тебе звати?"
читайте спочатку
echo -n "Як ваше прізвище?"
читати останнє
echo -n "Як ваше прізвище?"
читати середину
echo -n "Який твій день народження?"
читати день народження
echo -e "Ім'я: $ перше / nЗа останнє ім'я: $ останнє / нЗагальне ім'я: $ середина / nДень народження: $ день народження" >> /Users/matthewdavies/Desktop/user.txt
qlmanage -p "~ / Desktop / user.txt"

1
Вам НЕОБХІДНО створити цю змінну "logwrite"? Ви можете написати printf "%s\n" $var1 $var2 >> file?
glenn jackman

Ні, мені не потрібно, і в моєму переглянутому сценарії, над яким я працював, я не використовую змінну $ logwrite. Спасибі.
daviesgeek

Відповіді:


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

Пояснення:

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

Це навіть може бути спрощено далі:

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, здається, ви використовуєте неправильну косу рису з послідовністю втечі. \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 відповіді: якщо хтось із vars мав рядок \ n (або якусь іншу послідовність, наприклад \ t), вони будуть переведені. можна отримати щось подібне до його відповіді з printf:

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

також хм. я бачу, ви складаєте відповідь у змінну $ logwrite. якщо це виключно використання цієї змінної, це здається безглуздим.

Я думаю, що тут-документ може бути читабельніше, особливо якщо у вас є багато рядків для додавання до журналу:

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

(це слово EOF - це роздільник, який ви можете вибрати. це може бути будь-яке слово).

майте на увазі, що heredoc розширить $ змінні, як подвійні лапки. якщо ви цього не хочете, ви цитуєте гередок, як << "EOF"


річ у тому, що ніхто з вар не має \n, отже, чому я і відповів. Методика "що робити" перетворить кожне запитання на цьому сайті в нескінченну дискусію. Коли він приходить на цю дорогу, він може задати ще одне запитання :)
Джон Т

@elias змінна $ logwrite залишилася від моїх змін у сценарії під час внесення змін. Я вийняв $ logwrite var зі свого коду. Відповідь Джона Т. насправді спрацювала. Дуже дякую!
daviesgeek

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.