Có giải pháp đơn giản nào để ánh xạ số thứ tự như 1, 2, 3, ... vào bảng chữ cái a, b, c trong tập lệnh shell không?
Có giải pháp đơn giản nào để ánh xạ số thứ tự như 1, 2, 3, ... vào bảng chữ cái a, b, c trong tập lệnh shell không?
Câu trả lời:
Trong vỏ giống như 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
(với các phiên bản gần đây của ksh93
, bash
hoặc zsh
, bạn có thể rút ngắn set
dòng xuống set {a..z}
)
Hoặc là:
$ awk 'BEGIN{printf("%c\n", 0x60 + 5)}'
e
Với một số triển khai dc
(ít nhất là GNU dc
):
$ echo 96 5 + P | dc
e
Với zsh
, bạn có thể sử dụng cơ sở 36:
$ echo $(([##36] 9 + 5))
E
Hoặc sử dụng \0ooo
các chuỗi bát phân trong printf %b
:
$ printf '%b\n' "\0$(([##8]0x60 + 5))"
e
Đối với bảng chữ cái không phải tiếng Anh, giả sử ngôn ngữ UTF-8 (ở đây là tiếng Hy Lạp):
$ printf '%b\n' "\u$(([##16]0x3B0 + 5))"
ε
Điều đó dựa trên chuỗi ký tự trong Unicode, không có nhiều đảm bảo rằng thứ tự đó sẽ khớp với thứ tự chữ cái phổ biến cho ngôn ngữ của bạn trong khu vực của bạn, vì vậy bạn cũng có thể mã hóa toàn bộ danh sách các ký tự bằng tay và sử dụng mẫu đầu tiên.
Giống như bảng chữ cái tiếng Nga (theo Wikipedia):
$ set а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
$ echo "$5"
д
Mà không khớp chính xác với thứ tự Unicode.
zsh
nhưng cho ksh93
hoặc bash
, bạn cần a=('' {a..z})
(hoặc chỉ a=([1]=a {b..z})
với bash
) vì các shell đó bắt đầu mảng của chúng trên chỉ số 0 chứ không phải 1 trái với tất cả các shell khác .
a=({a..z}); echo ${a[5]}