Ich wollte mit dem folgenden Befehl eine Zeichenfolge aller ASCII-Zeichen ausgeben
for i in `seq 32 127`; do printf "%c" $i; done
Die Ausgabe des obigen Befehls lautet:
33333334444444444555555555566666666667777777777..............
Es ist die erste (von links) Ziffer jeder Zahl.
Beim Durchsuchen dieser Website bin ich auf die Antwort auf mein Problem gestoßen. Wie drucke ich alle druckbaren ASCII-Zeichen in der CLI? Ich verstehe jedoch immer noch nicht, warum mein Original-Snippet die ASCII-Zeichen nicht wie vorgesehen ausgibt.
bash
shell
character-encoding
ascii
Ifthikhan
quelle
quelle
comp.unix.shell
Thread darüber, warum es das Richtige ist;)
Antworten:
Sie können die ASCII-Codes nicht direkt drucken, indem Sie
printf "%c" $i
in C das Gleiche verwenden .Sie müssen zuerst den Dezimalwert von i in den Oktalwert umwandeln und dann mit
printf
und\
vor den jeweiligen Oktalwerten ausgeben.Um zu drucken
A
, müssen Sie die Dezimalzahl 65 in eine Oktalzahl konvertieren, dh 101, und dann müssen Sie diesen Oktalwert wie folgt drucken:Dies wird gedruckt
A
.Sie müssen es also ändern, um:
Mit können
awk
Sie jedoch direkt wie in C-Sprache druckenquelle
bash
undzsh
dies ohne die Schleife und ohne den externen Befehl:printf $(printf '\%o' {32..127})
.(char)(127)
Rücktaste oder so ähnlich. Was auch immer es ist, es erscheint als eine der Hexboxen oder wie auch immer sie heißen. Wenn Sie nur die "druckbare" (dh lesbare) möchten, gehen Sie einfach auf 126. Auch schön mit dem Oktal gedacht. Das ist schlau; Ich habe hexadezimal gedacht (wieprintf '\x%x; {32..126}
... oder 127, ich denke, da Sie alle es auch getan haben), aber es funktioniert nicht. Oktal rettet den Tag! :) Schließlich @Ifthikhan, ich bin nicht sicher, was du meinst.awk
verwendet häufig C-Befehle und wird nirgendwo anders%c
verwendet. Die Verwendung von Oktalzahlen unterscheidet sich von der Verwendung von Ein-Byte-Zeichen.%c
Interpretiert das zugehörige Argument als Zeichen: Es wird nur das erste Zeichen eines gegebenen Arguments gedrucktSie scheinen bereits eine Möglichkeit zum Drucken zu haben, aber hier ist eine Variante.
quelle
Sie brauchen
printf
, aber nur einmal; Sie können eine Verwendungprintf
durch die einfacheren und effizienterenecho
Plus-Bash-Escape-Sequenzen ersetzen :Mit hexagesimalen:
Mit Oktalen:
quelle