'echo' без нового рядка в сценарії оболонки


540

У мене echoв моєму сценарії є проблема :

echo -n "Some string..."

відбитки

-n Some string...

і переходить до наступного рядка. У консолі працює коректно без нового рядка:

Some string...

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

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

Я знаю, що це дуже давно, але це працює для мене в Windows 10, щоб додати період без нового рядка: echo | set / p = "."
SPlatten

Відповіді:


572

Існує кілька версій 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", яка є належним виконуваним файлом (тобто оболонками fork and execs /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 з дивно різними командами ехо, ви, мабуть, краще використовувати printf, або вам потрібно перевірити можливості команд ехо з чимось на зразок [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(принаймні, підтримка bash \ c, тому не потрібно використовувати -в варіант, але вам потрібна -е для баш)
Тимо

Для мене це робить саме те, що робить -n у випадку ОП: виводить буквально -e. Думаю, printf справді більш послідовний
aexl

-e не працюватиме в сценарії оболонки posix, він буде виведений на екран.
Томас

7

Для цього є два методи, якими я часто користуюся:

1. Використання символу втечі курсору ( \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", він може ігнорувати налаштування, і все одно перейде до нового рядка.



1

Я вірю, що зараз ваша друкована продукція, як показано нижче

~ echo -e "String1\nString2"
String1
String2

Ви можете використовувати xargsдля отримання багаторядкового stdout в одну лінію.

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

 ~

0

Коли ви переходите і пишете вам скрипт оболонки, завжди ставите перший рядок як #! / Usr / bin / env bash. Ця оболонка не опускає та не маніпулює послідовностями втечі. ex echo "Це перший \ n рядок" друкується Це перший \ n рядок.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.