โดยทั่วไปเชลล์สามารถเข้าใจตัวเลขฐานสิบหกฐานสิบและทศนิยมในตัวแปรหากพวกเขาถูกกำหนดเป็น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
หรือพวกเขาเป็นผลมาจาก "การขยายตัวทางคณิตศาสตร์":
$ : $(( 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
ดังนั้นคุณเพียงแค่ต้องการพิมพ์อักขระที่เป็นค่าตัวแปร
แต่นี่เป็นวิธีที่เป็นไปได้สองวิธี:
$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e
$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e
จำเป็นต้องใช้ printf สองอันอันหนึ่งเพื่อแปลงค่าให้เป็นสตริงเลขฐานสิบหกและที่สองเพื่อพิมพ์อักขระจริง
ส่วนที่สองจะพิมพ์จุด UNICODE ใด ๆ (หากตั้งค่าคอนโซลของคุณอย่างถูกต้อง)
ตัวอย่างเช่น:
$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"
☃
มนุษย์หิมะ
ตัวละครที่มี UTF-8 เป็นตัวแทนมีf0 9f 90 ae
0x1F42E
ค้นหาcow face site:fileformat.info
เพื่อรับมัน :
$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮
หมายเหตุ : มีปัญหาเกี่ยวกับวิธี UNICODE ในการทุบตีก่อน 4.3 (แก้ไขในรุ่นนั้นและสูงกว่า) ตัวละครระหว่าง UNICODE คะแนน 128 และ 255 (ทศนิยม) อาจพิมพ์ไม่ถูกต้อง
อ้างอิง
ภายในวรรคสี่PARAMETERS
ในman bash
:
หากตัวแปรมีชุดแอตทริบิวต์จำนวนเต็มค่าจะถูกประเมินเป็นนิพจน์ทางคณิตศาสตร์แม้ว่าจะไม่ได้ใช้การขยาย $ ((... )) (ดูที่การขยายตัวทางคณิตศาสตร์ด้านล่าง)
ภายใน "การประเมินผล ARITHMETIC" ในman bash
:
ค่าคงที่ที่มี 0 นำหน้าจะถูกตีความเป็นตัวเลขฐานแปด ส่วนนำ 0x หรือ 0X หมายถึงเลขฐานสิบหก มิฉะนั้นตัวเลขจะอยู่ในรูปแบบ [base #] n โดยที่ตัวเลือกพื้นฐานคือตัวเลขทศนิยมระหว่าง 2 ถึง 64 ที่แสดงถึงฐานเลขคณิตและ n คือตัวเลขในฐานนั้น หากไม่ระบุ base # ระบบจะใช้ฐาน 10 ตัวเลขที่มากกว่า 9 แสดงด้วยตัวอักษรตัวเล็กตัวอักษรตัวพิมพ์ใหญ่ @ และ _ ในลำดับนั้น หากฐานมีค่าน้อยกว่าหรือเท่ากับ 36 ตัวอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่อาจถูกใช้แทนกันเพื่อแสดงตัวเลขระหว่าง 10 ถึง 35