2012-06-10 2 views
134

Как я могу вывести multipline строка в Bash без использования нескольких вызовов эха, как так:Как вывести многострочную строку в Bash?

echo "usage: up [--level <n>| -n <levels>][--help][--version]" 
echo 
echo "Report bugs to: " 
echo "up home page: " 

Я ищу переносимый способ сделать это, используя только Bash встроенных команды.

EDIT

Это решение, которое я придумал, что вариация ответа Дениса.

read -d '' help <<- EOF 
    usage: up [--level <n>| -n <levels>][--help][--version] 

    Report bugs to: 
    up home page: 
EOF 

echo "$help" 
+4

Если вы выводите сообщение об использовании в ответ на неверный вызов, вы, как правило, отправить это сообщение для стандартной ошибки вместо стандартного вывода, с 'echo> & 2 ...' –

+2

@MarkReed Сообщение об использовании выводится путем ввода '--help' (который должен перейти в стандартную версию). – helpermethod

+0

Для других, которые приходят, более подробная информация о «здесь документах» доступна: http://www.tldp.org/LDP/abs/html/here-docs.html –

ответ

144

Здесь документы часто используются для этой цели.

cat << EOF 
usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: 
EOF 

Поддерживаются во всех производных от Bourne оболочек, включая все версии Bash.

+3

Yup - но 'cat' не является встроенным. –

+4

@MarkReed: Это правда, но это [всегда доступно] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html) (за исключением, возможно, в необычных обстоятельствах). –

+4

+1 Thx. Я закончил использование 'read -d '' help << - EOF ...', чтобы прочитать многострочную строку в переменной и затем повторить результат. – helpermethod

11

Используйте -e вариант, то вы можете напечатать символ новой строки с \n в строке.

Sample (но не уверен, хорошо ли один или нет)

Забавная вещь, что -e опция не документированы в MacOS's man page пока еще годны к употреблению. Он задокументирован в man page of Linux.

+3

Эти страницы руководства предназначены для команды 'echo', поставляемой системой'/bin/echo', которая на Mac OS не имеет опции '-e'. когда вы используете bash для этих систем, его встроенная команда 'echo' берет верх. Вы можете видеть это, явно набрав '/ bin/echo whatever' и наблюдая разницу в поведении. Чтобы увидеть документацию для встроенного, введите 'help echo'. –

+0

'/ bin/echo' часто отличается от одной ОС к другой и отличается от встроенного' echo' Bash. –

+0

@MarkReed: Я попробую позже, но спасибо за информацию. +1. Я просто оставлю свой ответ здесь, так как идет довольно много хороших обсуждений. – nhahtdh

102

или вы можете сделать это:

echo "usage: up [--level <n>| -n <levels>][--help][--version] 

Report bugs to: 
up home page: " 
+0

Является ли этот переносной, то есть он работает со всеми версиями Bash? – helpermethod

+2

Это будет работать, по крайней мере, до bash 2. –

+1

@OliverWeiler: Он будет работать даже в ракетах Борна, таких как Dash и [Heirloom Bourne Shell] (http://heirloom.sourceforge.net/sh.html). –

16

Поскольку в комментарии я рекомендовал printf, я должен, вероятно, привести некоторые примеры его использования (хотя для печати сообщения об использовании я с большей вероятностью воспользуюсь ответами Денниса или Криса). printf несколько сложнее в использовании, чем echo. Его первым аргументом является строка формата, в которой escape-последовательности (например, \n) являются всегда интерпретировано; он также может содержать директивы формата, начиная с %, которые контролируют, где и как любые дополнительные аргументы включены в него. Вот два разных подхода к использованию его для сообщения использования:

Во-первых, вы можете включить все сообщение в строке формата:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: \nup home page: \n" 

Обратите внимание, что в отличие от echo, вы должны включать окончательный перевод строки в явном виде. Кроме того, если сообщение содержит любые символы %, они должны быть записаны как %%.Если вы хотели бы включить в отчет об ошибке и стартовой адреса, они могут быть добавлены вполне естественно:

printf "usage: up [--level <n>| -n <levels>][--help][--version]\n\nReport bugs to: %s\nup home page: %s\n" "$bugreport" "$homepage" 

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

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: " "up home page: " 

с помощью этой опции, добавив и отчет об ошибке стартового адрес достаточно очевиден:

printf "%s\n" "usage: up [--level <n>| -n <levels>][--help][--version]" "" "Report bugs to: $bugreport" "up home page: $homepage" 
+0

+1 Приятно! Не знал, что вы можете предоставить несколько аргументов printf! – helpermethod

0

Кроме того, с отступом исходного кодом, который вы можете использовать < < - (с задней чертой), чтобы игнорировать ведущие вкладки или пробелы. Например это:

if [ some test ]; then 
    cat <<- xx 
     line1 
     line2 
xx 
fi 

Выходы с отступом текст без ведущих пробелов:

line1 
line2 
Смежные вопросы