Mam problem z echo
moim 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...
shell
command-line
sh
qwertz
źródło
źródło
bash
dział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?echo -ne "text without new line: "; echo "some text";
Odpowiedzi:
Istnieje wiele wersji
echo
polecenia o różnych zachowaniach. Najwyraźniej powłoka użyta w skrypcie używa wersji, która nie rozpoznaje-n
.printf
Komenda ma znacznie bardziej konsekwentne zachowanie.echo
jest w porządku dla prostych rzeczy, takich jakecho hello
, ale sugeruję używanieprintf
do czegokolwiek bardziej skomplikowanego.Z jakiego systemu korzystasz i jakiej powłoki używa Twój skrypt?
źródło
#!/bin/bash
, zadziałało. Zwykle pracuję z bash.printf
polecenia dla Windows .echo
zawsze dodaje nowe linie ... To obejście jest w najlepszym razie szarpane.%
to Twój monit powłoki. Spróbuj tego i uważnie obserwuj:printf hello; sleep 5
bash
ma wbudowane polecenie o nazwie „echo”:Dodatkowo istnieje polecenie „echo”, które jest właściwym plikiem wykonywalnym (tzn. Powłoka rozwidla i wykonuje
/bin/echo
, w przeciwieństwie do interpretacjiecho
i wykonywania):Zachowanie obu
echo
WRT\c
i-n
różni się. Najlepiej jest użyćprintf
, który jest dostępny w czterech różnych smakach * NIX, na które patrzyłem:źródło
Spróbuj z
Działa to dla mnie zgodnie z oczekiwaniami (jak zrozumiałem z twojego pytania).
Zauważ, że mam te informacje ze
man
strony.man
Strona zauważa również, że powłoka może mieć swoją własną wersjęecho
, a nie jestem pewien, czybash
ma własną wersję.źródło
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)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 :
-e
Flaga włącza znaki scape E w ciągu.\c
przywraca C ursor z powrotem do bieżącej linii.LUB
2. Za pomocą
printf
poleceniaPrzykład :
źródło
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.
źródło
Tylko dla najpopularniejszego systemu Linux
Ubuntu
i jest tobash
:Sprawdź, której powłoki używasz? Głównie poniżej działa, w przeciwnym razie zobacz :
echo $0
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"
źródło
Uważam, że teraz Twoje wydruki są drukowane jak poniżej
Możesz użyć,
xargs
aby ustawić wieloliniowe wyjście standardowe w tej samej linii.źródło
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.
źródło
źródło