Wie kann ich "-n" mit "echo" drucken?

7

Ich kann mir nicht vorstellen, wie ich die Zeichenfolge "-n" mit dem über 30 Jahre alten Befehl drucken soll echo.

Ich habe diese ausprobiert:

Michaels:Scripts$ echo -n
Michaels:Scripts$ echo "-n"
Michaels:Scripts$ echo -e "-n"
Michaels:Scripts$ echo -- -n
-- -n
Michaels:Script$ echo -- "-n"
-- -n
Michaels:Script$ echo "\-n"
\-n

Ich benutze Mac OS X ML. Ich halte dieses Verhalten für sehr seltsam und unerwartet.

Michael
quelle
1
Siehe auch
slm
Es besteht die Möglichkeit, dass Sie ein Leerzeichen verwenden können, z. B.echo " -n"
Valentin Bajrami

Antworten:

7

Wenn Sie nicht verwenden möchten, prinfhaben Sie einige Optionen, zumindest gemäß dieser SO-Frage und Antwort mit dem Titel: Echo "-n" wird nicht -n drucken? .

Dies scheint Ihre beste Option zu sein:

$ echo "x-n" | cut -c 2-
-n

Oder eine Variation:

$ echo -- '-n'|cut -d" " -f2
-n

printf

printf hat dieses Problem nicht:

$ printf "%s\n" -n
-n
slm
quelle
Könnten Sie bitte den zweiten Befehl erklären, insb. der Ausschnitt davon :)
Michael
1
@Michael - sicher, es nimmt die Ausgabe von echo -- '-n', was ist -- -n. cutteilt dann die Ausgabe auf Leerzeichen auf und nimmt das 2. Feld, daher das -n.
slm
7

Warum sollten Sie verwenden möchten echo? Verwendungprintf :

printf -- '-n\n'

Oder:

printf '%s\n' -n

Mit echo:

echo -n

Wird -n<LF>in einer UNIX-konformen Ausgabe ausgegeben echo.

bash, dashGNU oder zshecho (in der Standardkonfiguration) kann es tun , mit:

echo -en '-n\n'

Oder (auf ASCII-basierten Systemen):

echo -e '\055n'

Zsh echokann es tun mit:

echo - -n

bash(aber nicht zsh):

echo -n -; echo n

Interessanterweise ist es unmöglich, -nmit echoPOSIX allein auszugeben (dh mehr oder weniger portabel zwischen Unices und Unix-Likes), da das Verhalten, wenn das erste Argument -nBackslash-Zeichen enthält oder wenn ein Argument Backslash-Zeichen enthält, nicht angegeben ist.

Stéphane Chazelas
quelle
Wenn Sie ein Unicode-Terminal haben, können Sie \ u2011 (oder \ u2010) ausgeben, das mit einem - identisch ist. Dies ist jedoch kaum eine Lösung (und es gibt keine tragbare Möglichkeit, die Unicode-Zeichen einzuführen, ohne die Codierung des Terminalemulators zu kennen).
Rici
Ich verwende ksh, echo -e "\ x2d" druckt "\ x2d", aber der oktale Ausdruck echo -e "\ 055" druckt das richtige "-". Irgendwelche Gedanken bitte? Vielen Dank
Forever Learner
1
@CppLearner, ja echoist nicht portabel. Nicht benutzen echo. Für Unix - kompatible echo‚s echo '\055'ausgeben würde das 0x2d Byte ( -in ASCII, aber Unix - Systeme sind nicht auf die Verwendung ASCII als ihre Basis charsets erforderlich ist , verwenden einige noch EBCDIC). Das Verhalten für echo '\x2d'ist jedoch nicht spezifiziert. Ebenso printf '\055'ist POSIX und portabel, printf '\x2d'ist keine.
Stéphane Chazelas
Vielen Dank, Stéphane Chazelas, für die Klarstellung und die schnelle Abwicklung.
Für immer Lernende
2

Führen Sie aus historischen Gründen echonicht die übliche Art der Argumentanalyse durch, bei der jedes Argument, das mit beginnt, -eine Option ist, mit der Ausnahme, dass --das Ende der Option signalisiert wird. Der echoBefehl meist druckt seine Argumente unverändert, aber in Abhängigkeit von der Unix - Variante, auf der Schale und auf , wie die Shell konfiguriert ist, kann es einige Optionen (interpretieren -e, -E, -n, -) und behandeln kann Backslash + Zeichen speziell.

Es gibt keine tragbare Art und Weise zu drucken , -nmit echoallein. Die tragbare Möglichkeit, eine Zeichenfolge zu drucken, ohne sich um Sonderzeichen kümmern zu müssen, ist

printf %s -n

oder allgemeiner print %s "$somestring". Wenn Sie nach der Zeichenfolge eine letzte neue Zeile drucken möchten, machen Sie das printf '%s\n' -n.

Gilles 'SO - hör auf böse zu sein'
quelle
0

Versuchen Sie dies, wenn Sie "-n" als erste zwei Symbole benötigen:

echo -e '\r-n'

Ein anderer Weg:

echo -n '-'; echo 'n'
Stapelwechsler
quelle
Dies druckt zu Beginn eine zusätzliche CR.
Gilles 'SO - hör auf böse zu sein'
Welche Art von Begriff verwenden Sie?
Stackexchanger
Was für was? Schale? Jede Shell, die implementiert, -egibt 4 Bytes aus: 0d 2d 6e 0a(hexadezimal geschrieben). Jede Shell, die nicht implementiert -ewird, druckt entweder 2d 65 20 5c 72 2d 6e 0aoder 2d 65 20 0d 2d 6e 0a.
Gilles 'SO - hör auf böse zu sein'
Oder meintest du was für ein Terminal? Das ist irrelevant. Die CR ist möglicherweise nicht ersichtlich, wenn echoauf das Terminal geschrieben wird, sie befindet sich jedoch in der Ausgabe von echo.
Gilles 'SO - hör auf böse zu sein'
Ja, Begriff bedeutet Terminal. Der Fragesteller möchte nur drucken, probiere meine Variante mit bash + Linux aus. Möglicherweise machen MacOs es falsch.
Stackexchanger