Ánh xạ thứ tự vào bảng chữ cái trong tập lệnh shell


7

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:


11

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, bashhoặc zsh, bạn có thể rút ngắn setdò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 \0ooocá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.


5
đối với hệ vỏ có mảng và mở rộng {a..z}, nếu bạn muốn tránh ghi đè các tham số vị trí $ 1, $ 2, v.v., nhưng đừng bận tâm tạo một biến mới,a=({a..z}); echo ${a[5]}
Jeff Schaller

lên cho giải pháp cơ sở 36. Mảng liên kết, một cái gì đó như mảng [$ i] = letteri, xuất hiện trong đầu tôi.
frams

2
@JeffSchaller, hoạt động cho zshnhưng cho ksh93hoặ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 .
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.