Ordnen Sie die Ordnungszahl dem Alphabet im Shell-Skript zu

7

Gibt es eine einfache Lösung, um Ordnungszahlen wie 1, 2, 3, ... in einem Shell-Skript dem Alphabet a, b, c zuzuordnen?

Bogenschütze
quelle

Antworten:

11

In Bourne-ähnlichen Muscheln:

$ set a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo "$5"
e

(mit neueren Versionen von ksh93, bashoder zshkönnen Sie die verkürzen setLinie set {a..z})

Oder:

$ awk 'BEGIN{printf("%c\n", 0x60 + 5)}'
e

Mit einigen Implementierungen von dc(mindestens GNU dc):

$ echo 96 5 + P | dc
e

Mit zshkönnen Sie Basis 36 verwenden:

$ echo $(([##36] 9 + 5))
E

Oder verwenden Sie \0ooooktale Sequenzen in printf %b:

$ printf '%b\n' "\0$(([##8]0x60 + 5))"
e

Für nicht englische Alphabete unter der Annahme eines UTF-8-Gebietsschemas (hier für Griechisch):

$ printf '%b\n' "\u$(([##16]0x3B0 + 5))"
ε

Dies basiert auf der Zeichenfolge in Unicode. Es gibt nicht viele Garantien dafür, dass diese Reihenfolge mit der in Ihrer Region üblichen alphabetischen Reihenfolge für Ihre Sprache übereinstimmt. Sie können also auch die vollständige Liste der Zeichen von Hand hart codieren und das erste Formular verwenden.

Wie für das russische Alphabet (laut Wikipedia):

$ set а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
$ echo "$5"
д

Was nicht genau mit der Unicode-Reihenfolge übereinstimmt.

Stéphane Chazelas
quelle
5
für Shells mit Arrays und {a..z} -Erweiterung, wenn Sie vermeiden möchten, die Positionsparameter $ 1, $ 2 usw. zu überfrachten, aber nichts dagegen haben, eine neue Variable zu erstellen,a=({a..z}); echo ${a[5]}
Jeff Schaller
bis zur Base 36-Lösung. Das assoziative Array, so etwas wie Array [$ i] = letteri, kommt mir zuerst in den Sinn.
Frams
2
@JeffSchaller, dass die Arbeiten für zshaber für ksh93oder bash, was Sie brauchen a=('' {a..z})(oder a=([1]=a {b..z})mit bashnur) als jene Schalen beginnen ihre Anordnungen auf dem Index 0 und nicht 1 im Gegensatz zu allen anderen Shells .
Stéphane Chazelas