'echo' bez znaku nowej linii w skrypcie powłoki

540

Mam problem z echomoim skryptem:

echo -n "Some string..."

odciski

-n Some string...

i przechodzi do następnej linii. W konsoli działa poprawnie bez znaku nowej linii:

Some string...
qwertz
źródło
2
Jakiej implementacji powłoki bourne używasz? Jeśli bashdziałam w trybie powłoki Bourne'a, działa tutaj dobrze. Poza tym jest mało prawdopodobne, że tak naprawdę używasz powłoki Bourne'a jako interaktywnej powłoki, prawda?
FatalError
4
w systemie Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii,
Wiem, że to jest bardzo stare, ale działa na mnie w Windows 10, aby dodać kropkę bez nowej linii: echo | set / p = "."
SPlatten

Odpowiedzi:

572

Istnieje wiele wersji echopolecenia o różnych zachowaniach. Najwyraźniej powłoka użyta w skrypcie używa wersji, która nie rozpoznaje -n.

printfKomenda ma znacznie bardziej konsekwentne zachowanie. echojest w porządku dla prostych rzeczy, takich jak echo hello, ale sugeruję używanie printfdo czegokolwiek bardziej skomplikowanego.

Z jakiego systemu korzystasz i jakiej powłoki używa Twój skrypt?

Keith Thompson
źródło
46
Zaczynając od linii #!/bin/bash, zadziałało. Zwykle pracuję z bash.
qwertz
Żałuję, że nie ma odpowiednika Windows w CMD :( O ile widzę, nie ma po prostu obejść tego samego zachowania.
kayleeFrye_onDeck 24.09.16
2
@kayleeFrye_onDeck: Być może istnieje wersja printfpolecenia dla Windows .
Keith Thompson
Chciałbym. echozawsze dodaje nowe linie ... To obejście jest w najlepszym razie szarpane.
kayleeFrye_onDeck 26.09.16
2
@alper Jest %to Twój monit powłoki. Spróbuj tego i uważnie obserwuj:printf hello; sleep 5
Keith Thompson
150

bash ma wbudowane polecenie o nazwie „echo”:

$ type echo
echo is a shell builtin

Dodatkowo istnieje polecenie „echo”, które jest właściwym plikiem wykonywalnym (tzn. Powłoka rozwidla i wykonuje /bin/echo, w przeciwieństwie do interpretacji echoi wykonywania):

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

Zachowanie obu echoWRT \ci -nróżni się. Najlepiej jest użyć printf, który jest dostępny w czterech różnych smakach * NIX, na które patrzyłem:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
aqn
źródło
3
Dzięki za bardzo szczegółową odpowiedź!
Darth Egregious,
91

Spróbuj z

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

Działa to dla mnie zgodnie z oczekiwaniami (jak zrozumiałem z twojego pytania).

Zauważ, że mam te informacje ze manstrony. manStrona zauważa również, że powłoka może mieć swoją własną wersję echo, a nie jestem pewien, czy bashma własną wersję.

Synek
źródło
+1 za wskazanie mi właściwego kierunku, chociaż echo, które nie rozpoznaje opcji -ne prawdopodobnie nie rozpoznaje opcji -e (ani nie potrzebuje), więc prawdopodobnie powinieneś po prostu powiedzieć echo "some string...\c"zamiast tego. Jeśli jednak potrzebujesz obsługiwać wiele wariantów bash z bardzo różniącymi się poleceniami echa, prawdopodobnie lepiej jest użyć printf lub musisz sprawdzić możliwości poleceń echa za pomocą czegoś podobnego [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(przynajmniej bash obsługuje także \ c, więc nie musisz używać -n opcja, ale potrzebujesz b-e dla bash)
Timo,
Dla mnie robi to dokładnie to, co -n robi w przypadku OP: wypisuje literał -e.
Wydaje
-e nie będzie działać w skrypcie powłoki POSIX, zamiast tego zostanie wyświetlony na ekranie.
Thomas Dignan,
7

Aby to osiągnąć, są w zasadzie dwie metody, których często używam:

1. Używając znaku zmiany znaczenia kursora ( \c) przy pomocyecho -e

Przykład :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eFlaga włącza znaki scape E w ciągu.
  • \cprzywraca C ursor z powrotem do bieżącej linii.

LUB

2. Za pomocą printfpolecenia

Przykład :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4
Geniusz
źródło
3

Jeśli użyjesz echa wewnątrz if z innymi poleceniami, takimi jak „czytaj”, może to zignorować ustawienie i i tak przejdzie do nowej linii.

Alexandre Strube
źródło
2

Tylko dla najpopularniejszego systemu Linux Ubuntu i jest to bash:

  1. Sprawdź, której powłoki używasz? Głównie poniżej działa, w przeciwnym razie zobacz :

    echo $0

  2. Jeśli powyżej drukuje bash, to poniżej będzie działać:

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

Manohar Reddy Poreddy
źródło
1

Uważam, że teraz Twoje wydruki są drukowane jak poniżej

~ echo -e "String1\nString2"
String1
String2

Możesz użyć, xargsaby ustawić wieloliniowe wyjście standardowe w tej samej linii.

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

 ~
rɑːdʒɑ
źródło
0

Kiedy idziesz i piszesz, skrypt powłoki zawsze umieszczaj pierwszy wiersz jako #! / Usr / bin / env bash. Ta powłoka nie pomija ani nie manipuluje sekwencjami ucieczki. ex echo „To jest pierwsza \ n linia” drukuje To jest pierwsza \ n linia.

Amit Singh
źródło
0
enable -n echo
echo -n "Some string..."
Riccardo La Marca
źródło