'echo' без перевода строки в сценарии оболочки


541

У меня проблема с echoмоим скриптом:

echo -n "Some string..."

печать

-n Some string...

и переходит на следующую строку. В консоли работает корректно без перевода строки:

Some string...

2
Какую реализацию оболочки Bourne вы используете? Если я запускаю bashв режиме оболочки Bourne, здесь все работает нормально. Кроме того, маловероятно, что вы действительно используете оболочку Борна в качестве интерактивной оболочки, не так ли?
FatalError

4
на Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii

Я знаю, что это очень старая версия, но она работает для меня в Windows 10, чтобы добавить точку без новой строки: echo | set / p = "."
Сплаттен

Ответы:


574

Существует несколько версий echoкоманды с различным поведением. Очевидно оболочка, используемая для вашего скрипта, использует версию, которая не распознает -n.

У printfкоманды гораздо более последовательное поведение. echoхорошо для простых вещей, как echo hello, но я предлагаю использовать printfдля чего-то более сложного.

На какой системе вы работаете, и какую оболочку использует ваш скрипт?


46
Начиная с линии #!/bin/bashэто работало. Обычно я работаю с Bash.
qwertz

Хотелось бы, чтобы в CMD был аналог Windows :( Насколько я вижу, нет, просто обходные пути для достижения того же поведения.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: Возможно, есть версия команды для Windows printf.
Кит Томпсон

Хотелось бы. echoвсегда добавляет новые строки ... Обходной путь в лучшем случае дрянной.
kayleeFrye_onDeck

2
@alper Это %ваша командная строка . Попробуйте это и посмотрите внимательно:printf hello; sleep 5
Кит Томпсон

150

bash имеет «встроенную» команду под названием «эхо»:

$ type echo
echo is a shell builtin

Кроме того, есть команда «echo», которая является надлежащим исполняемым файлом (то есть оболочка разветвляется и исполняется /bin/echo, в отличие от ее интерпретации echoи выполнения):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

Поведение любого из echoWRT зависит от \cи -nменяется. Ваш лучший выбор - использовать printfчетыре варианта * NIX, которые я рассмотрел:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
Спасибо за огромный подробный ответ!
Дарт Эгредиос

91

Попробуй с

echo -e "Some string...\c"

У меня работает как положено (как я понял из вашего вопроса).

Обратите внимание, что я получил эту информацию со manстраницы. На manстранице также отмечается, что оболочка может иметь свою собственную версию echo, и я не уверен, что bashимеет свою собственную версию.


+1 за подсказку в правильном направлении, хотя эхо, которое не распознает параметр -ne, вероятно, также не распознает параметр -e (и не нужно), так что вы, вероятно, хотите просто сказать echo "some string...\c"вместо этого. Однако, если вам нужно поддерживать несколько вариантов bash с дико отличающимися командами echo, вам, вероятно, лучше использовать printf, или вам нужно проверять возможности команд echo с чем-то вроде [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(по крайней мере, bash также поддерживает \ c, так что нет необходимости использовать -n вариант, но вам нужен -e для bash)
Тимо

Для меня это именно то, что -n делает в случае OP: выводит литерал -e. Я думаю, что printf действительно более последовательный
19

-e не будет работать в скрипте оболочки posix, вместо этого он будет выводиться на экран.
Томас

7

Для достижения этого есть два основных метода, которые я часто использую:

1. Используя escape-символ курсора ( \c) сecho -e

Пример :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eфлаг включает символы E scape в строке.
  • \cприносит C ursor назад к текущей строке.

ИЛИ

2. Используя printfкоманду

Пример :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

Если вы используете echo внутри if с другими командами, такими как «read», он может игнорировать настройку и в любом случае перейдет на новую строку.


2

Просто для самого популярного Linux Ubuntu и это bash:

  1. Проверьте, какую оболочку вы используете? Главным образом ниже работает, еще посмотрите это :

    echo $0

  2. Если выше печатает bash, то ниже будет работать:

    printf "hello with no new line printed at end"
    ИЛИ
    echo -n "hello with no new line printed at end"


1

Я верю, что сейчас ваша выходная печать, как показано ниже

~ echo -e "String1\nString2"
String1
String2

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

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

Когда вы пишете сценарий оболочки, всегда ставьте первую строку как #! / Usr / bin / env bash. Эта оболочка не опускает и не управляет escape-последовательностями. ex echo "Это первая \ n строка" печатает Это первая \ n строка.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.