В Bash попробовал это:
echo -e "hello\nworld"
Но он не печатает только новую строку \n
. Как я могу заставить его напечатать новую строку?
Я использую Ubuntu 11.04.
В Bash попробовал это:
echo -e "hello\nworld"
Но он не печатает только новую строку \n
. Как я могу заставить его напечатать новую строку?
Я использую Ubuntu 11.04.
Ответы:
Вы можете использовать printf
вместо:
printf "hello\nworld\n"
printf
имеет более последовательное поведение, чем echo
. Поведение echo
сильно различается в разных версиях.
printf %"s\n" hello world
- printf будет повторно использовать формат, если задано слишком много аргументов
echo
поддерживаете -e
опцию.
echo
, -e
просто печатается в самом выводе, поэтому я думаю, что этот ответ совершенно верный, поскольку echo
здесь не согласуется (если мы не говорим о конкретной версии).
Вы уверены, что находитесь в Bash? У меня работает все четыре способа:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
-e
param не существует на всех * nix OS
echo $'hello\nworld'
печать
hello
world
$''
Строки использовать ANSI C Цитирование :
Слова формы обрабатываются специально. Слово расширяется до строки , символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.
$'string'
Вы всегда можете сделать echo ""
.
например
echo "Hello"
echo ""
echo "World"
echo ""
работает для меня, и я думаю, что это самая простая форма для печати новой строки, даже если это не дает прямого ответа на вопрос. Приветствия.
echo -en "\n"
.
echo
достаточно, чтобы получить пустую строку
Пытаться
echo -e "hello\nworld"
hello
world
работал для меня в nano
редакторе.
Со страницы руководства:
-e
включить интерпретацию обратной косой черты
В случае, если кто-то окажется, что бьет себя головой о стену, пытаясь понять, почему сценарий коллеги не будет печатать переводы строк, следите за этим ->
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
echo $(GET_RECORDS);
Как и в приведенном выше примере, фактическое выполнение метода само может быть заключено в эхо-сигнал, который заменяет любые эхо-сигналы, которые могут присутствовать в самом методе. Очевидно, я поливал это для краткости, это было не так легко обнаружить!
Затем вы можете сообщить своим товарищам, что лучший способ выполнения функций будет выглядеть так:
#!/bin/bash
function GET_RECORDS()
{
echo -e "starting\n the process";
}
GET_RECORDS;
POSIX 7 на эхо
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
не определяется, и обратные слэши определяются реализацией:
Если первый операнд -n или если любой из операндов содержит символ <backslash>, результаты определяются реализацией.
если у вас нет дополнительного расширения XSI.
Поэтому я рекомендую вам использовать printf
вместо этого, что хорошо указано:
операнд формата должен использоваться как строка формата, описанная в нотации формата файла XBD [...]
\ n <newline> Переместите позицию печати в начало следующей строки.
Также имейте в виду, что Ubuntu 15.10 и большинство дистрибутивов реализуют echo
как:
help echo
which echo
что может привести к некоторой путанице.
Просто наберите
echo
чтобы получить новую линию
str='hello\nworld'
$ echo | sed "i$str"
hello
world
У меня это работает в CentOS:
echo -e ""hello\nworld""
Вы также можете сделать:
echo "hello
world"
Это работает как внутри скрипта, так и из командной строки.
В командной строке нажмите Shift+, Enterчтобы сделать разрывы строк внутри строки.
Это работает для меня на моем MacOS и Ubuntu 18.04
Еще одна запись для тех, кто не работал с любым из этих решений и которым необходимо получить возвращаемое значение из их функции:
function foo()
{
local v="Dimi";
local s="";
.....
s+="Some message here $v $1\n"
.....
echo $s
}
r=$(foo "my message");
echo -e $r;
Только этот трюк работал в Linux, над которым я работал с этим bash:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Надеюсь, это поможет кому-то с подобной проблемой.
Мой сценарий:
echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Вывод:
WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:
На моем скрипте bash я злился как ты, пока не попробовал:
echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"
Просто нажмите Enter, где вы хотите вставить этот прыжок. Вывод теперь:
WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:
Вы также можете использовать эхо с фигурными скобками,
$ (echo hello; echo world)
hello
world
echo hello; echo world
Это может быть лучше сделано как
x="\n"
echo -ne $x
Опция -e интерпретирует обратную косую черту для escape-последовательности.
Опция -n удаляет завершающий символ новой строки в выходных данных.
PS: команда echo всегда включает заключительный символ новой строки в выводе, поэтому -n требуется, чтобы отключить эту вещь (и сделать ее менее запутанной)
Существует новое расширение параметр добавлен в bash 4.4
который интерпретирует управляющие последовательности:
${parameter@operator} - E operator
Раскрытие - это строка, представляющая собой значение параметра с escape-последовательностями с обратной косой чертой, развернутыми, как в
$'…'
механизме цитирования.
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Если вы пишете сценарии и несколько раз будете повторять строки как часть других сообщений, хорошим кроссплатформенным решением будет поместить буквенную строку в переменную следующим образом:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
Иногда вы можете передать несколько строк, разделенных пробелом, и это будет интерпретировано как \n
.
Например, при использовании сценария оболочки для многострочных уведомлений:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
\n
. Он интерпретируется как отдельный аргумент для программы, и сама программа может отображать этот аргумент в новой строке, но это не означает, что он был преобразован \n
в любой момент и полностью зависит от программы.
Это привело меня туда ....
outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff
Урожайность:
RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]
Дополнительное решение:
В случаях, вы должны повторить многострочное из длинного содержимого (например, код / конфигурации)
Например :
echo -e
,
printf
Может иметь некоторые ограничения
Вы можете использовать специальный символ в качестве заполнителя в качестве разрыва строки (например, ~
) и заменить его после того, как файл был создан с помощьюtr
echo ${content} | tr '~' '\n' > $targetFile
это должно вызвать другую программу ( tr
), которая должна быть хорошей IMO.