Nói chung, shell có thể hiểu các số hex, oct và thập phân trong các biến, miễn là chúng được định nghĩa là integers
:
$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
Hoặc chúng là kết quả của "Mở rộng số học":
$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304
Vì vậy, bạn chỉ cần một cách để in ký tự thuộc về một giá trị biến.
Nhưng đây là hai cách có thể:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
Cần có hai printf, một để chuyển đổi giá trị thành chuỗi thập lục phân và chuỗi thứ hai để thực sự in ký tự.
Cái thứ hai sẽ in bất kỳ điểm UNICODE nào (nếu bảng điều khiển của bạn được đặt chính xác).
Ví dụ:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
Một người tuyết.
Các nhân vật có đại diện utf-8 f0 9f 90 ae
là 0x1F42E
. Tìm kiếm cow face site:fileformat.info
để có được nó :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
Lưu ý : Có một vấn đề với cách UNICODE trong đó đối với bash trước 4.3 (được sửa trong phiên bản đó trở lên), các ký tự giữa UNICODE điểm 128 và 255 (ở dạng thập phân) có thể được in không chính xác.
Người giới thiệu
Đoạn thứ tư bên PARAMETERS
trong man bash
:
Nếu biến có tập thuộc tính số nguyên, thì giá trị được đánh giá là biểu thức số học ngay cả khi mở rộng $ ((...)) không được sử dụng (xem Mở rộng số học bên dưới).
Bên trong "ĐÁNH GIÁ ARITHMETIC" trong man bash
:
Các hằng số có 0 đứng đầu được hiểu là các số bát phân. Số 0x hoặc 0X hàng đầu biểu thị thập lục phân. Mặt khác, các số có dạng [cơ sở #] n, trong đó cơ sở tùy chọn là số thập phân từ 2 đến 64 đại diện cho cơ sở số học và n là một số trong cơ sở đó. Nếu cơ sở # bị bỏ qua, thì cơ sở 10 được sử dụng. Các chữ số lớn hơn 9 được biểu thị bằng các chữ cái viết thường, các chữ cái viết hoa, @ và _, theo thứ tự đó. Nếu cơ sở nhỏ hơn hoặc bằng 36, chữ cái viết thường và chữ hoa có thể được sử dụng thay thế cho nhau để thể hiện các số từ 10 đến 35.