Próbuję drukować -n
za pomocą echo
polecenia. Ale jeśli po prostu piszę echo -n
, wydaje tylko nowy wiersz, nie pokazuje się -n
, zamiast tego wydaje nowy wiersz.
getopt
(???) do analizowania wiersza poleceń
Próbuję drukować -n
za pomocą echo
polecenia. Ale jeśli po prostu piszę echo -n
, wydaje tylko nowy wiersz, nie pokazuje się -n
, zamiast tego wydaje nowy wiersz.
getopt
(???) do analizowania wiersza poleceń
Odpowiedzi:
Problem polega na tym, że echo
interpretuje to -n
jako 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, 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.
$ 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
rev
Polecenie po prostu drukuje jego wyjście odwrócone.
Użyj odpowiedniego narzędzia do pracy
$ printf -- '-n\n'
-n
grep '^-n'
. pritnf
to naprawdę droga.
printf
tak jest lepiej, ale pytanie dotyczy sprawiedliwego echo
.
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ć :
% printf "-n\n"
-n
echo
, podczas gdy printf
jest lepiej znormalizowany .
Możesz użyć tego polecenia, ale dodaje ono dodatkowe miejsce.
echo -e "\r-n"
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 parametr echo
.
PS Najlepszym rozwiązaniem jest IMHO
echo -e "-n\c"
Nie dodaje się żadnych dodatkowych znaków .
echo -e "-n\n"
wypisuje to samo, ale z nowym znakiem linii.
-n
jest ważny, -nfoo
nie jest tak, że zostanie wydrukowany.
man echo
też to ma. Ale help
jest trochę lepiej.
/bin/echo
jest zupełnie inną rzeczą i kiedy uruchamiasz echo
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ć:
echo "-n "
Działa to, ponieważ while -n
jest prawidłową opcją dla echo
, -n
a spacja po nim nie jest. Ponieważ nie jest to opcja, echo
wystarczy ją wydrukować.
Naprawdę się nad tym zastanowiliście.
echo -e \\055n
Lub bez końca nowej linii
echo -en \\055n
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, jak echo
i 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.
W skrypcie Bash możesz uruchomić:
echo -n -
echo n
Lub w powłoce interakcyjnej:
echo -n - ; echo n
To echo
jest -
postać i n
postać.
-pilot6@Pilot6:~$
. Drugie wyjścia n
.
&&
- nie powiedziałbym, że ta odpowiedź jest zła .
Możesz biegać
printf -n;echo
Testowane w Busybox Ash
ash
to nazwa powłoki Almquist.
echo -n -- -n
działa (nie masz pod ręką żadnego linuksa do przetestowania)?