Как разбить длинную строку на несколько строк, назначенных переменной в сценарии bash linux

Нет. debian шаблон для lxc-create внутри использует debootstrap, который обязательно проверяет загруженные пакеты по подписям релизов в репозитории, как и apt.

1
28.02.2019, 19:15
4 ответа

Одно предложение:

x='Lorem ipsum dolor sit amet, consectetur '\
'adipiscing elit, sed do eiusmod tempor '\
'incididunt ut labore et dolore magna aliqua.'

Что приводит к ожидаемому:

$ printf '%s\n' "$x"
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
4
27.01.2020, 23:30

Предположим, вы хотите присвоить строку some long piece of text to assignпеременной str. Это не сработает:

str='some long'
'piece of text'
'to assign'

Он попытается запустить строки после первой как команды, вы, вероятно, получите ошибку "команда не найдена".

Вы можете сделать это, но новые строки будут встроены в переменную, так что это не будет одна строка:

str='some long
piece of text
to assign'

Хотя вы можете использовать расширение замены подстроки (в Bash, ksh, zsh ), чтобы заменить их пробелами, например. str="${str//$'\n'/ }", чтобы выполнить замену и сохранить новое значение в той же переменной. Обратите внимание, что любой завершающий пробел во всех строках, кроме последней, останется в строке.

Другой вариант — использовать +=для добавления к значению переменной (также только Bash, ksh, zsh):

str='some long'
str+=' piece of text'
str+=' to assign'

Здесь любой пробел нужно будет ввести вручную в кавычках.

Или аналогично в стандартной оболочке:

str='some long'
str="$str"' piece of text'
str="$str"' to assign'

Тогда есть способ с продолжением строки (, который Джефф уже упоминал в их ответе):

str='some long'\
' piece of text'\
' to assign'

Здесь также важны конечные пробелы, продолжение строки работает только в том случае, если за обратной косой чертой сразу следует новая строка, а не в том случае, если между ними есть пробелы.

1
27.01.2020, 23:30

Назначение длинных строк в виде нескольких подстрок -в массиве может сделать код более привлекательным с эстетической точки зрения:

#!/bin/bash

text=(
    'Contrary to popular'
    'belief, Lorem Ipsum'
    'is not simply'
    'random text. It has'
    'roots in a piece'
    'of classical Latin'
    'literature from 45'
    'BC, making it over'
    '2000 years old.'
)

# output one line per string in the array:
printf '%s\n' "${text[@]}"

# output all strings on a single line, delimited by space (first
# character of $IFS), and let "fmt" format it to 45 characters per line
printf '%s\n' "${text[*]}" | fmt -w 45
6
27.01.2020, 23:30

Я бы написал так в командной строке. Можно было бы, конечно, и сжатее, но для ясности:

~$ text='You can do this, but the newlines will be embedded in the variable, so it won’t be a single line'

~$ array=$(echo $text | cut -d' ' -f 1-)

~$ for x in ${array[@]}; do echo $x ; done

Вот один лайнер:

~$ echo $text | tr ' ' '\n'

Выход:

You
can
do
this,
but
the
newlines
will
be
embedded
in
the
variable,
so
it
won’t
be
a
single
line

Или, для отсортированного вывода:

~$ echo $text | tr ' ' '\n' | sort

Выход:

a
be
be
but
can
do
embedded
in
it
line
newlines
single
so
the
the
this,
variable,
will
won’t
You

0
02.10.2020, 19:49

Теги

Похожие вопросы