シェルスクリプトで序数(たとえば、1、2、3、...)を文字a、b、cにマッピングする簡単なソリューションはありますか?
答え1
Bourneのようなシェルから:
$ 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
(最新バージョンでは、またはksh93
この行を次のように短縮できます)bash
zsh
set
set {a..z}
または:
$ awk 'BEGIN{printf("%c\n", 0x60 + 5)}'
e
いくつかの実装ではdc
(少なくともGNU dc
):
$ echo 96 5 + P | dc
e
パスすると、zsh
デフォルトの36を使用できます。
$ echo $(([##36] 9 + 5))
E
または、次の\0ooo
8進数シーケンスを使用してくださいprintf %b
。
$ printf '%b\n' "\0$(([##8]0x60 + 5))"
e
英語以外の文字の場合は、UTF-8ロケール(ここではギリシャ語)を想定しています。
$ printf '%b\n' "\u$(([##16]0x3B0 + 5))"
ε
これはUnicodeの文字順序に基づいており、その順序がその地域の言語の一般的なアルファベット順序と一致するという保証はないため、文字リスト全体を手動でハードコードして最初の形式を使用することもできます。
ロシアのアルファベットのように(Wikipediaによると):
$ set а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
$ echo "$5"
д
これはUnicodeの順序とまったく一致しません。