Próbuję drukować -nza pomocą echopolecenia. Ale jeśli po prostu piszę echo -n, wydaje tylko nowy wiersz, nie pokazuje się -n, zamiast tego wydaje nowy wiersz.
Problem polega na tym, że echointerpretuje to -njako argument. W domyślnej implementacji bash oznacza to (od help echo):
-n do not append a newline
Istnieją różne sposoby obejścia tego:
Zmień go w coś, co nie jest opcją, dołączając inną postać. Na przykład powiedz, echoaby nie drukować nowego wiersza -n, a następnie powiedz mu, aby zinterpretował znaki ukośnika odwrotnego -ei wyraźne dodanie nowego wiersza.
$ echo -ne '-n\n'-n
Alternatywnie, po prostu wstaw spację
$ echo " -n"-n
To jednak dodaje przestrzeń, której prawdopodobnie nie chcesz.
Użyj przed nim znaku niedrukowalnego. Tutaj. Używam backspace ( \b)
$ echo -e "\b-n"-n
Dodaje to także dodatkową postać, której prawdopodobnie nie chcesz.
Użyj podstępu
$ echo n-| rev
-n
revPolecenie po prostu drukuje jego wyjście odwrócone.
@ Pilot6 tak, ale problem z tym podejściem (twoim i moim) polega na tym, że dodaje on dodatkowego charakteru. Może to powodować problemy. Zwłaszcza jeśli chcesz to przeanalizować i spróbować czegoś takiego grep '^-n'. pritnfto naprawdę droga.
terdon
Cóż, i printftak jest lepiej, ale pytanie dotyczy sprawiedliwego echo.
Pilot6
2
Wygląda na to, że echo -e "-n\c"robi dokładnie to samo.
Pilot6
1
\ctłumi dalszą produkcję
Pilot6
15
Czasami dobrym pomysłem jest użycie odpowiedniego narzędzia. Zamiast printftego możesz użyć :
Wow! To jest lepsze niż moje; czy możesz wyjaśnić trochę „początkującym” ;-)
Sadi
Dzięki, zauważyłem również, że nie ma znaczenia, gdzie dodajesz znak powrotu karetki, na początku lub na końcu.
Sadi
@Sadi tak, ponieważ dodawanie czegokolwiek powoduje, że jest to niepoprawna opcja. -njest ważny, -nfoonie jest tak, że zostanie wydrukowany.
terdon
@terdon man echoteż to ma. Ale helpjest trochę lepiej.
Pilot6
Wiem, że to ma, to po prostu nie ma znaczenia. /bin/echojest zupełnie inną rzeczą i kiedy uruchamiasz echobash, dostajesz wbudowaną funkcję, która może być zupełnie inna w zależności od twojej powłoki.
terdon
5
Myślę, że jeśli zdecydowanie chcesz używać echotylko, powinno cię to zadowolić:
echo "-n "
Działa to, ponieważ while -njest prawidłową opcją dla echo, -na spacja po nim nie jest. Ponieważ nie jest to opcja, echowystarczy ją wydrukować.
Tak, właśnie odpowiedziałem w ten sposób. Usunie moją odpowiedź. Jest to stosunkowo przenośne, ponieważ działa z wbudowanym echem i /bin/echoprzynajmniej jeśli jest wywoływane jakoecho -e "\055n"
dniu
-en nie jest tym, czego chcę.
Star OS
2
Aby rozszerzyć odpowiedź @ AB, jedynym przenośnym sposobem na użycie echojest powstrzymanie się od korzystania z takich opcji jak -n. printfZamiast tego rozważ użycie, jeśli jest dostępne. Ta strona zawiera szczegółowe informacje i bardzo dobrze wyjaśnia, kiedy, jak echoi jakprintf należy z niej korzystać:
Obecnie echo (1) jest przenośne tylko wtedy, gdy pominiesz flagi i sekwencje specjalne. Zamiast tego użyj printf (1), jeśli potrzebujesz więcej niż zwykłego tekstu.
Wyjścia pierwszego polecenia -pilot6@Pilot6:~$. Drugie wyjścia n.
Pilot6
@ Pilot6 Zależy od tego, czy używasz go w interaktywnym terminalu, czy w skrypcie bash, który nie jest określony w pytaniu. OTOH, jeśli potrzebujesz go w terminalu, po prostu połącz te dwie linie &&- nie powiedziałbym, że ta odpowiedź jest zła .
user12205,
Zedytuję to, aby stało się o wiele bardziej zrozumiałe dla skryptu bash.
echo -n -- -n
działa (nie masz pod ręką żadnego linuksa do przetestowania)?getopt
(???) do analizowania wiersza poleceńOdpowiedzi:
Problem polega na tym, że
echo
interpretuje to-n
jako argument. W domyślnej implementacji bash oznacza to (odhelp echo
):Istnieją różne sposoby obejścia tego:
Zmień go w coś, co nie jest opcją, dołączając inną postać. Na przykład powiedz,
echo
aby nie drukować nowego wiersza-n
, a następnie powiedz mu, aby zinterpretował znaki ukośnika odwrotnego-e
i wyraźne dodanie nowego wiersza.Alternatywnie, po prostu wstaw spację
To jednak dodaje przestrzeń, której prawdopodobnie nie chcesz.
Użyj przed nim znaku niedrukowalnego. Tutaj. Używam backspace (
\b
)Dodaje to także dodatkową postać, której prawdopodobnie nie chcesz.
Użyj podstępu
rev
Polecenie po prostu drukuje jego wyjście odwrócone.Użyj odpowiedniego narzędzia do pracy
źródło
grep '^-n'
.pritnf
to naprawdę droga.printf
tak jest lepiej, ale pytanie dotyczy sprawiedliwegoecho
.echo -e "-n\c"
robi dokładnie to samo.\c
tłumi dalszą produkcjęCzasami dobrym pomysłem jest użycie odpowiedniego narzędzia. Zamiast
printf
tego możesz użyć :źródło
echo
, podczas gdyprintf
jest lepiej znormalizowany .Możesz użyć tego polecenia, ale dodaje ono dodatkowe miejsce.
To jest rodzaj włamania.
-e
włącza symbole poleceń z odwrotnym ukośnikiem.\r
jest zwrot karetki.Właściwie każdy
\
prawidłowy znak zrobi w dowolnym miejscu ciągu.Możesz sprawdzić, które są ważne przez
help echo
.echo "-n"
nie działa, ponieważ-n
jest wykorzystywany jako parametrecho
.PS Najlepszym rozwiązaniem jest IMHO
Nie dodaje się żadnych dodatkowych znaków .
wypisuje to samo, ale z nowym znakiem linii.
źródło
-n
jest ważny,-nfoo
nie jest tak, że zostanie wydrukowany.man echo
też to ma. Alehelp
jest trochę lepiej./bin/echo
jest zupełnie inną rzeczą i kiedy uruchamiaszecho
bash, dostajesz wbudowaną funkcję, która może być zupełnie inna w zależności od twojej powłoki.Myślę, że jeśli zdecydowanie chcesz używać
echo
tylko, powinno cię to zadowolić:Działa to, ponieważ while
-n
jest prawidłową opcją dlaecho
,-n
a spacja po nim nie jest. Ponieważ nie jest to opcja,echo
wystarczy ją wydrukować.źródło
Naprawdę się nad tym zastanowiliście.
Lub bez końca nowej linii
źródło
printf "-n\n"
jest przesadzanie?/bin/echo
przynajmniej jeśli jest wywoływane jakoecho -e "\055n"
Aby rozszerzyć odpowiedź @ AB, jedynym przenośnym sposobem na użycie
echo
jest powstrzymanie się od korzystania z takich opcji jak-n
.printf
Zamiast tego rozważ użycie, jeśli jest dostępne. Ta strona zawiera szczegółowe informacje i bardzo dobrze wyjaśnia, kiedy, jakecho
i jakprintf
należy z niej korzystać:źródło
W skrypcie Bash możesz uruchomić:
Lub w powłoce interakcyjnej:
To
echo
jest-
postać in
postać.źródło
-pilot6@Pilot6:~$
. Drugie wyjścian
.&&
- nie powiedziałbym, że ta odpowiedź jest zła .Trzy inne sposoby:
źródło
Możesz biegać
Testowane w Busybox Ash
źródło
ash
to nazwa powłoki Almquist.