在 shell 脚本中将序号映射到字母表

在 shell 脚本中将序号映射到字母表

是否有任何简单的解决方案可以在 shell 脚本中将序数(如 1、2、3、...)映射到字母 a、b、c?

答案1

在类似 Bourne 的 shell 中:

$ 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,您可以将该行缩短为)bashzshsetset {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八进制序列printf %b

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

对于非英语字母,假设采用 UTF-8 语言环境(此处为希腊语):

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

这是基于 Unicode 中的字符序列,无法保证该顺序与您所在地区的语言的常见字母顺序相匹配,因此您也可以手动对完整的字符列表进行硬编码并使用第一种形式。

就像俄语字母表一样(根据维基百科):

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

这与 Unicode 顺序不完全匹配。

相关内容