Пытаюсь вставить новую строку в переменную в bash [дубликат]


этот вопрос уже есть ответ здесь:

у меня есть

var="a b c"
for i in $var
do
   p=`echo -e $p'n'$i`
done
echo $p

Я хочу, чтобы последнее Эхо для печати

a
b
c

обратите внимание, что я хочу, чтобы переменная p содержала новые строки. Как мне это сделать?

7 69

7 ответов:

резюме

  1. вставка \n

    p="${var1}\n${var2}"
    echo -e "${p}"
    
  2. вставка новой строки в исходном коде

    p="${var1}
    ${var2}"
    echo "${p}"
    
  3. используя $'\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

тривиальное решение состоит в том, чтобы поместить эти новые строки туда, где вы их хотите.

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. Использование расширений оболочки.

это в основном расширение команды с несколькими командами:

  1. echo-e

    var="$( echo -e "a\nb\nc" )"
    
  2. bash и zsh printf '%b'

    var="$( printf '%b' "a\nb\nc" )"
    
  3. The bash printf-v

    printf -v var '%b' "a\nb\nc"
    
  4. простой простой 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 контролируется злоумышленником.

нет необходимости использовать для

вы можете воспользоваться функциями расширения параметров bash:

var="a b c"; 
var=${var// /\n}; 
echo -e $var
a
b
c

или просто использовать tr:

var="a b c"
echo $var | tr " " "\n"
a
b
c

sed устранение:

echo "a b c" | sed 's/ \+/\n/g'

результат:

a
b
c
var="a b c"
for i in $var
do
   p=`echo -e "$p"'\n'$i`
done
echo "$p"

решение было просто защитить вставленную новую строку с "" во время текущей итерации, когда происходит подстановка переменных.