Gibt es eine einfache Lösung, um Ordnungszahlen wie 1, 2, 3, ... in einem Shell-Skript dem Alphabet a, b, c zuzuordnen?
Gibt es eine einfache Lösung, um Ordnungszahlen wie 1, 2, 3, ... in einem Shell-Skript dem Alphabet a, b, c zuzuordnen?
Antworten:
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
, bash
oder zsh
können Sie die verkürzen set
Linie 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 zsh
können Sie Basis 36 verwenden:
$ echo $(([##36] 9 + 5))
E
Oder verwenden Sie \0ooo
oktale 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.
zsh
aber für ksh93
oder bash
, was Sie brauchen a=('' {a..z})
(oder a=([1]=a {b..z})
mit bash
nur) als jene Schalen beginnen ihre Anordnungen auf dem Index 0 und nicht 1 im Gegensatz zu allen anderen Shells .
a=({a..z}); echo ${a[5]}