Я пытаюсь распечатать, -nиспользуя echoкоманду. Но если я просто наберу echo -n, он выдает только новую строку, а не появляется -n, вместо этого выдает новую строку.
Проблема в том, что echoинтерпретируется -nкак аргумент. В реализации bash по умолчанию это означает (с help echo):
-n do not append a newline
Есть разные способы обойти это:
Превратите это во что-то, что невозможно, включив другого персонажа. Например, скажите echoне печатать символ новой строки -n, затем скажите ему интерпретировать экранирование обратной косой черты -eи явно добавить символ новой строки.
$ echo -ne '-n\n'-n
Или просто укажите пробел
$ echo " -n"-n
Это, однако, добавляет пробел, который вы, вероятно, не хотите.
Используйте непечатный символ перед ним. Вот. Я использую Backspace ( \b)
$ echo -e "\b-n"-n
Это также добавляет дополнительный символ, который вы, вероятно, не хотите.
Используйте обман
$ echo n-| rev
-n
Команда revпросто печатает свой вывод в обратном порядке.
Вы правы, что подойдет любой действительный символ `\`.
Pilot6
@ Pilot6 да, но проблема с этим подходом (вашим и моим) заключается в том, что он добавляет дополнительный символ. Это может вызвать проблемы в будущем. Особенно если потом захочешь разобрать и попробовать что-то подобное grep '^-n'. pritnfэто путь, действительно.
Terdon
Ну, printfв любом случае лучше, но вопрос касается просто echo.
Pilot6
2
Похоже, echo -e "-n\c"делает то же самое.
Pilot6
1
\cэто подавить дальнейший вывод
Pilot6
15
Иногда хорошей идеей является использование правильного инструмента. Вы можете использовать printfвместо этого:
Wov! Это лучше, чем у меня; Вы можете объяснить немного для "новичков" ;-)
Сади
Спасибо, я также заметил, что не имеет значения, где вы добавляете возврат каретки, в начале или в конце.
Сади
@ Сади, да, это потому, что добавление чего-либо делает его недействительным. -nдействительно, -nfooне так, что будет напечатано.
Terdon
У @terdon man echoтоже есть. Но helpэто немного лучше.
Pilot6
Я знаю, что это есть, это просто не актуально. /bin/echoэто совершенно другая вещь, и когда вы запускаете echoв bash, вы получаете встроенные функции, которые могут сильно отличаться в зависимости от вашей оболочки.
Terdon
5
Я думаю, что если вы определенно хотите использовать echoтолько, это должно удовлетворить вас:
echo "-n "
Это работает, потому что, хотя -nявляется допустимым параметром echo, -nс пробелом после него нет. Так как это не вариант, echoпросто печатает его.
Да, я просто ответил таким образом. Удалит мой ответ. Это относительно переносимо в том /bin/echoecho -e "\055n"
смысле,
не то, что я хочу.
Star OS
2
Чтобы расширить ответ @ AB, единственный переносимый способ echo- это воздерживаться от использования таких опций, как -n. Попробуйте использовать printfвместо этого, где это возможно Эта справочная страница содержит более подробную информацию и очень хорошо объясняет, когда и как echoи как printfследует использовать:
В настоящее время echo (1) является переносимым, только если вы опустите флаги и escape-последовательности. Вместо этого используйте printf (1), если вам нужно больше, чем просто текст.
Я собираюсь продлить ответ, пожалуйста, отредактируйте ответ.
Star OS
Я не уверен, что это хорошая идея, чтобы изменить ответ другого человека до такой степени, что он будет иметь больше текста от меня, чем от первоначального автора.
Первые командные выходы -pilot6@Pilot6:~$. Вторые выходы n.
Pilot6
@ Pilot6 Зависит от того, используете ли вы его в интерактивном терминале или в bash-скрипте, который не указан в вопросе. OTOH, если вам это нужно в терминале, просто объединить две строки &&- я бы не сказал, что этот ответ неправильный .
user12205
Я отредактирую это так, что это станет намного более понятным, это для сценария bash.
echo -n -- -n
(нет Linux-box удобного для тестирования)?getopt
(???) для разбора командной строкиОтветы:
Проблема в том, что
echo
интерпретируется-n
как аргумент. В реализации bash по умолчанию это означает (сhelp echo
):Есть разные способы обойти это:
Превратите это во что-то, что невозможно, включив другого персонажа. Например, скажите
echo
не печатать символ новой строки-n
, затем скажите ему интерпретировать экранирование обратной косой черты-e
и явно добавить символ новой строки.Или просто укажите пробел
Это, однако, добавляет пробел, который вы, вероятно, не хотите.
Используйте непечатный символ перед ним. Вот. Я использую Backspace (
\b
)Это также добавляет дополнительный символ, который вы, вероятно, не хотите.
Используйте обман
Команда
rev
просто печатает свой вывод в обратном порядке.Используйте правильный инструмент для работы
источник
grep '^-n'
.pritnf
это путь, действительно.printf
в любом случае лучше, но вопрос касается простоecho
.echo -e "-n\c"
делает то же самое.\c
это подавить дальнейший выводИногда хорошей идеей является использование правильного инструмента. Вы можете использовать
printf
вместо этого:источник
echo
, хотяprintf
и лучше стандартизирован .Вы можете использовать эту команду, но она добавляет дополнительный пробел.
Это своего рода хак.
-e
включает символы команды обратной косой черты.\r
это возврат каретки.На самом деле любой
\
допустимый символ будет делать в любом месте строки.Вы можете увидеть, какие из них действительны
help echo
.echo "-n"
не работает, потому что-n
используется в качестве параметра дляecho
.PS Лучшее решение ИМХО это
Это не добавляет никаких дополнительных символов .
печатает то же самое, но с новой строкой char.
источник
-n
действительно,-nfoo
не так, что будет напечатано.man echo
тоже есть. Ноhelp
это немного лучше./bin/echo
это совершенно другая вещь, и когда вы запускаетеecho
в bash, вы получаете встроенные функции, которые могут сильно отличаться в зависимости от вашей оболочки.Я думаю, что если вы определенно хотите использовать
echo
только, это должно удовлетворить вас:Это работает, потому что, хотя
-n
является допустимым параметромecho
,-n
с пробелом после него нет. Так как это не вариант,echo
просто печатает его.источник
Вы, ребята, действительно обдумываете это.
Или без запятой
источник
printf "-n\n"
происходит переосмысление?/bin/echo
echo -e "\055n"
Чтобы расширить ответ @ AB, единственный переносимый способ
echo
- это воздерживаться от использования таких опций, как-n
. Попробуйте использоватьprintf
вместо этого, где это возможно Эта справочная страница содержит более подробную информацию и очень хорошо объясняет, когда и какecho
и какprintf
следует использовать:источник
В скрипте Bash вы можете запустить:
Или в интерактивной оболочке:
Это
echo
эс на-
характер иn
характер.источник
-pilot6@Pilot6:~$
. Вторые выходыn
.&&
- я бы не сказал, что этот ответ неправильный .Три других способа:
источник
Вы можете запустить
Проверено в Busybox Ash
источник
ash
- это название Almquist Shell.