it-swarm.com.ru

Добавление символов новой строки в unix-переменные оболочки

Я новичок в сценариях Shell. У меня есть переменная в сценарии оболочки, в которой я хотел бы отформатировать данные. Переменная хранит новые данные во время каждой итерации цикла. Каждый раз, когда новые данные сохраняются, я хотел бы вставить символ новой строки. Вот как я пытаюсь сохранить данные в переменной.

VARIABLE="$VARIABLE '\n' SomeData"

К сожалению, вывод включает в себя буквальный '\n' Любая помощь будет благодарна. Заранее спасибо.

30
James P.

Попробуйте $'\n':

VAR=a
VAR="$VAR"$'\n'b
echo "$VAR"

дает мне

a
b
55
vmpstr

Обычная техника:

nl='
'
VARIABLE="PreviousData"
VARIABLE="$VARIABLE${nl}SomeData"

echo "$VARIABLE"
PreviousData
SomeData
20
William Pursell
VAR="one"
VAR="$VAR.\n.two"
echo -e $VAR

Результат:

один. 
.два

5
Alex

Кроме $'\n' вы можете использовать printf также вот так:

VARIABLE="Foo Bar"
VARIABLE=$(printf "${VARIABLE}\nSomeData")
echo "$VARIABLE"

Результат:

Foo Bar
SomeData
3
anubhava

Это намного проще, чем вы думаете:

VARIABLE="$VARIABLE
SomeData"
1
chepner

Одиночная кавычка Все специальные символы между этими кавычками теряют свои особое значение.
https://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

Таким образом, используемый вами синтаксис делает что-то другое, чего вы хотите достичь.

Это то, что вам нужно:

Конструкция $ '\ X' делает опцию -e в echo ненужной . 
https://linux.die.net/abs-guide/escapingsection.html

echo -e "something\nsomething"

или же 

echo "something"$'\n'"something"
1
user8175891

У меня была проблема со всеми остальными решениями: при использовании #, за которым следует SPACE (довольно часто при записи в Markdown), оба они будут разбиты на новую строку.

Таким образом, другой способ сделать это - использовать одинарные кавычки, чтобы "\ n" отображалось.

FOO=$'# Markdown Title #\n'
BAR=$'Be *brave* and **bold**.'
FOOBAR="$FOO$BAR"

echo "$FOOBAR"

Результат:

# Markdown Title #
Be *brave* and **bold**.
1
pattulus

Основываясь на первых двух решениях, я бы сделал, как показано ниже. Конкатенация строк с оператором «+ =», мне как-то понятнее.

Также не забывайте использовать printf, а не echo, вы избавите себя от многих проблем

sometext="This is the first line"
sometext+=$'\n\n'
sometext+="This is the second line AFTER the inserted new lines"
printf '%s' "${sometext}"

Результаты:

Это первая строка

Это третья строка ПОСЛЕ вставленной новой строки

0
Almendrico