Как я могу вывести многострочную строку в Bash без использования нескольких эхо-вызовов, например, так:
echo "usage: up [--level <n>| -n <levels>][--help][--version]"
echo
echo "Report bugs to: "
echo "up home page: "
Я ищу портативный способ сделать это, используя только встроенные функции Bash.
echo >&2 ...
--help
(что должно идти в стандартный выход).printf
решение на основе от Гордона Дэвидсона. Несмотря на то, что он находится в тени подходовecho
илиcat
основанных на них подходов, кажется, что это намного меньше помехи. По общему признанию синтаксис `printf 'представляет собойОтветы:
Здесь документы часто используются для этой цели.
Они поддерживаются во всех оболочках Bourne, включая все версии Bash.
источник
cat
не встроенный.read -d '' help <<- EOF ...
чтобы прочитать многострочную строку в переменную, а затем повторил результат.или вы можете сделать это:
источник
Вдохновленный проницательными ответами на этой странице, я создал смешанный подход, который я считаю самым простым и более гибким. Что вы думаете?
Во-первых, я определяю использование в переменной, что позволяет мне использовать его в разных контекстах. Формат очень прост, почти WYSIWYG, без необходимости добавлять какие-либо управляющие символы. Это кажется мне достаточно портативным (я запускал его на MacOS и Ubuntu)
Тогда я могу просто использовать его как
или, что еще лучше, при разборе параметров я могу просто отобразить его там в одну строку:
источник
echo "$__usage"
.echo $__usage
не сработало.Используйте
-e
опцию, тогда вы можете напечатать символ новой строки\n
в строке.Образец (но не уверен, хороший ли он или нет)
Самое интересное, что этот-e
параметр не задокументирован на справочной странице MacOS, но все еще доступен для использования. Это задокументировано на странице руководства Linux .источник
echo
команды/bin/echo
, которая в Mac OS не имеет-e
опции. когда вы используете bash в этих системах, его встроеннаяecho
команда вступает во владение. Вы можете увидеть это, явно набрав/bin/echo whatever
и наблюдая разницу в поведении. Чтобы увидеть документацию для встроенного, введитеhelp echo
./bin/echo
часто отличается от одной ОС к другой и отличается от встроенного в Bashecho
.echo -e
не является переносимым - например, некоторые реализации echo будут выводить «-e» как часть вывода. Если вы хотите переносимости, используйте вместо этого printf. Например, / bin / echo на OS X 10.7.4 делает это. IIRC встроенное эхо bash было также странным в 10.5.0, но я больше не помню деталей.echo -e
укусил меня раньше ... Определенно используйтеprintf
илиcat
с наследственником.<<-
Вариант здесь документы особенно приятно , потому что вы можете раздеться ведущими отступы на выходе, но отступы для удобства чтения в сценарииПоскольку я рекомендовал
printf
в комментарии, я, вероятно, должен привести несколько примеров его использования (хотя для печати сообщения об использовании я бы с большей вероятностью использовал ответы Денниса или Криса).printf
немного сложнее в использовании, чемecho
. Его первый аргумент - это строка формата, в которой экранирование (например\n
) всегда интерпретируется; он также может содержать директивы формата, начиная с%
которых, которые определяют, где и как любые дополнительные аргументы включаются в него. Вот два разных подхода к его использованию для сообщения об использовании:Во-первых, вы можете включить все сообщение в строку формата:
Обратите внимание, что в отличие от этого
echo
, вы должны явно указывать заключительный символ новой строки. Кроме того, если сообщение содержит какие-либо%
символы, они должны быть записаны как%%
. Если вы хотите включить адреса отчетов об ошибках и домашнюю страницу, их можно добавить совершенно естественно:Во-вторых, вы можете просто использовать строку формата, чтобы она выводила каждый дополнительный аргумент в отдельной строке:
С этой опцией добавление адресов багрепорта и домашней страницы довольно очевидно:
источник
Также с отступом исходного кода вы можете использовать
<<-
(с завершающей чертой), чтобы игнорировать ведущие вкладки (но не ведущие пробелы). Например это:Выводит текст с отступом без начальных пробелов:
источник
Если вы используете решение из @jorge и обнаружите, что все в одной строке, убедитесь, что вы заключили переменную в кавычки:
будет печатать все в одной строке, тогда как
сохранит новые строки.
источник
cat <<EOF .... EOF
&& echo "$ foo"