Пытаюсь вставить новую строку в переменную в bash [дубликат]
этот вопрос уже есть ответ здесь:
- как я могу иметь новую строку в строке в sh? 10 ответов
у меня есть
var="a b c"
for i in $var
do
p=`echo -e $p'n'$i`
done
echo $p
Я хочу, чтобы последнее Эхо для печати
a
b
c
обратите внимание, что я хочу, чтобы переменная p содержала новые строки. Как мне это сделать?
7 ответов:
резюме
вставка
\n
p="${var1}\n${var2}" echo -e "${p}"
вставка новой строки в исходном коде
p="${var1} ${var2}" echo "${p}"
используя
$'\n'
(всего Баш и zsh)p="${var1}"$'\n'"${var2}" echo "${p}"
подробности
1. Вставка
\n
p="${var1}\n${var2}" echo -e "${p}"
echo -e
интерпретирует два символа"\n"
как новый линия.var="a b c" first_loop=true for i in $var do p="$p\n$i" # Append unset first_loop done echo -e "$p" # Use -e
избегайте дополнительной ведущей новой строки
var="a b c" first_loop=1 for i in $var do (( $first_loop )) && # "((...))" is bash specific p="$i" || # First -> Set p="$p\n$i" # After -> Append unset first_loop done echo -e "$p" # Use -e
С помощью функции
embed_newline() { local p="" shift for i in "$@" do p="$p\n$i" # Append done echo -e "$p" # Use -e } var="a b c" p=$( embed_newline $var ) # Do not use double quotes "$var" echo "$p"
2. Вставка новой строки в исходный код
var="a b c" for i in $var do p="$p $i" # New line directly in the source code done echo "$p" # Double quotes required # But -e not required
избегайте дополнительной ведущей новой строки
var="a b c" first_loop=1 for i in $var do (( $first_loop )) && # "((...))" is bash specific p="$i" || # First -> Set p="$p $i" # After -> Append unset first_loop done echo "$p" # No need -e
С помощью функции
embed_newline() { local p="" shift for i in "$@" do p="$p $i" # Append done echo "$p" # No need -e } var="a b c" p=$( embed_newline $var ) # Do not use double quotes "$var" echo "$p"
3. Используя
$'\n'
(менее портативный)Баш и zsh интерпретирует
$'\n'
в новой строке.var="a b c" for i in $var do p="$p"$'\n'"$i" done echo "$p" # Double quotes required # But -e not required
избежать дополнительных ведущая новая строка
var="a b c" first_loop=1 for i in $var do (( $first_loop )) && # "((...))" is bash specific p="$i" || # First -> Set p="$p"$'\n'"$i" # After -> Append unset first_loop done echo "$p" # No need -e
С помощью функции
embed_newline() { local p="" shift for i in "$@" do p="$p"$'\n'"$i" # Append done echo "$p" # No need -e } var="a b c" p=$( embed_newline $var ) # Do not use double quotes "$var" echo "$p"
выход одинаковый для всех
a b c
особая благодарность участникам этого ответа:kevinf,Гордон Дэвиссон,l0b0,Dolda2000 и tripleee.
EDIT
- см. также ответ BinaryZebra предоставляя множество подробности.
- ответ Абхиджита Растоги и Дмитрия, объясните, как избежать
for
петли в выше Баш сниппеты.
тривиальное решение состоит в том, чтобы поместить эти новые строки туда, где вы их хотите.
var="a b c"
Да, это задание, завернутое в несколько строк.
тем не менее, вам нужно будет дважды процитировать значение при интерполяции, иначе оболочка разделит его на пробелы, эффективно превратив каждую новую строку в один пробел (а также разверните любые подстановочные знаки).
echo "$p"
Как правило, вы должны дважды цитировать все переменные интерполяции, если вы специально желайте поведения, описанного выше.
попробовать
echo $'a\nb'
.Если вы хотите сохранить его в переменной, а затем использовать его с нетронутыми строки, вам придется правильно цитирую ваших использование:
var=$'a\nb\nc' echo "$var"
или, чтобы исправить ваш пример программы буквально:
var="a b c" for i in $var; do p="`echo -e "$p\n$i"`" done echo "$p"
Существует три уровня, на которых новая строка может быть вставлена в переменную.
Что ж..., технически четыре, но первые два-это всего лишь два способа написания новой строки в коде.1.1. При создании.
самое основное-это создать переменную с новыми строками уже.
Мы пишем значение переменной в коде с уже вставленными новыми строками.$ var="a > b > c" $ echo "$var" a b c
или внутри кода скрипта:
var="a b c"
Да, это значит писать введите где это необходимо в коде.
1.2. Создание с помощью оболочки цитирования.
последовательность $' - это специальные расширения оболочки в bash и zsh.
var=$'a\nb\nc'
строка анализируется оболочкой и расширяется до "var=" aновая строкаbновая строкаc"", что именно то, что мы хотим, чтобы переменная var быть.
Это будет не работать на старых ракушки.2. Использование расширений оболочки.
это в основном расширение команды с несколькими командами:
echo-e
var="$( echo -e "a\nb\nc" )"
bash и zsh printf '%b'
var="$( printf '%b' "a\nb\nc" )"
The bash printf-v
printf -v var '%b' "a\nb\nc"
простой простой printf (работает на большинстве оболочек):
var="$( printf 'a\nb\nc' )"
3. Использование оболочки исполнение.
все команды, перечисленные во втором варианте, могут быть использованы для расширения значения var, если этот var содержит специальные символы.
Итак, все, что нам нужно сделать, это получить эти значения внутри var и выполнить некоторую команду, чтобы показать:var="a\nb\nc" # var will contain the characters \n not a newline. echo -e "$var" # use echo. printf "%b" "$var" # use bash %b in printf. printf "$var" # use plain printf.
обратите внимание, что printf несколько небезопасно, если значение var контролируется злоумышленником.