รับค่า ASCII ตัวเลขสำหรับอักขระ


10

ฉันพยายามเขียนเชลล์สคริปต์ที่ขออักขระ ASCII ในช่วง AZ หรือ az และส่งกลับค่าตัวเลขที่เทียบเท่ากัน ตัวอย่างเช่นผลลัพธ์อาจมีลักษณะดังต่อไปนี้:

scarlet$ Please type a character between A and Z or between a and z:
scarlet$ A       
scarlet$ The decimal value of A is: 65 

ความพยายามของฉัน:

#!/bin/bash
echo Enter a letter:
read A
echo -n ${A} | od -i | head -1 | cut -b 10- | tr -d " "

ฉันแก้ไขคำถามที่สองของคุณเนื่องจากไม่เกี่ยวข้อง คุณควรโพสต์แยกต่างหาก (คุณสามารถรับข้อความต้นฉบับได้ที่นี่ )
Michael Mrozek

ตัวอย่างของคุณใช้ได้กับฉัน คุณสามารถวางผลลัพธ์ที่แสดงว่าเกิดอะไรขึ้นและอธิบายความผิดพลาดได้ ไม่echo -n Aทำสิ่งที่คุณคาดหวัง? ถ้าไม่ลองprintfแทน ไม่od -iทำสิ่งที่คุณคาดหวัง? od -t d1ถ้าไม่ได้ลอง
Mikel

1
ฉันพยายาม od -t d1 ทำงานได้ดี ... ขอบคุณ
Host Post

คำตอบ:



8

POSIX:

$ printf %d\\n \'a
97

นอกจากนี้ยังใช้ได้กับอักขระที่ไม่ใช่ ASCII ใน bash 4.0 และใหม่กว่าและใน zsh:

$ printf %x\\n \'あ
3042

คุณยังสามารถใช้recode ..dumpเพื่อดูจุดรหัสเลขฐานสิบหก:

$ printf aあ|recode ..dump
UCS2   Mne   Description

0061   a     latin small letter a
3042   a5    hiragana letter a

2
เพื่อให้ "คลุมเครือ" น้อยลงหนึ่งอาจใช้เช่นA=a ; printf '%d\n' "'$A'"และใน ksh บางสิ่งบางอย่างเช่นA=a; integer N=$(("'$A'")); print $N(ไม่จำเป็นต้องพิมพ์หรือ printf)
jelmd

3

อาจจะ:

#!/bin/bash

echo -n "Enter a letter:"
read A
echo ${A}|od -t d1|awk '{printf "%s",$2}';echo

ไชโย


ฉันจะใช้ awk แทน nawk นี่เป็นมาตรฐานที่ค่อนข้างดีสำหรับทุกรุ่น awk
asoundmove

แก้ไขเป็นนิสัยของฉันของการใช้ 'nawk' ตั้งแต่ฉันได้ไม่ awk ในที่ทำงาน
D4RIO

ใช่ทางออกของคุณก็ใช้ได้สำหรับฉันเช่นกันขอบคุณ
Host Post

1

วิธีการแก้ปัญหาที่ไม่ต้องทำก็แค่ทุบตีและก็พิมพ์เล็กลงเรื่อย ๆ zเป็นตัวละครที่ค้นหานี่sคือการค้นหา i=97เพราะ ascii (a) = 97 ที่เหลือเห็นได้ชัด

z=s 
i=97
for c in {a..z}
do 
    [ "$c" = "$z" ] && echo $i && break || ((i+=1))
done

คุณสามารถใส่มันลงในบรรทัดเดียวแน่นอน นี่คือเซมิโคลอนบางส่วน: ;;;;;(ควรจะเพียงพอ)


ฉันทดสอบโค้ดด้านบน .. แต่มันไม่ได้ผลสำหรับฉัน .. ฉันได้รับข้อความแจ้งว่า "ฉัน + = 1" ไม่พบ!
โฮสต์โพสต์

งานนี้ในทุบตี คุณอาจต้องการ i = $ ((i + 1)) แทน
ผู้ใช้ที่ไม่รู้จัก

ในหนึ่งบรรทัดและด้วยการอ่านคีย์จากแป้นพิมพ์:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

ลองod -t d1ถ้าคุณมี รูปแบบผลลัพธ์อื่น ๆ ค่อนข้างแปลก

คุณไม่จำเป็นต้องหัวและบาดเช่น:

printf "A" | od -t d1 | read addr num && echo $num

0

หากคุณต้องการโปรแกรมที่ทำสิ่งนี้และคุณไม่ได้ทำแบบฝึกหัดนี้มีโปรแกรมที่เรียกasciiว่าทำสิ่งนี้ distro ของคุณอาจมีมันเป็นแพคเกจแล้วถ้าไม่ได้รับจากhttp://www.catb.org/~esr/ascii/


0
# Get one character per loop, until the user presses <Enter>
while true ; do 
    read -n 1 c
    (( ${#c} == 0 )) && break # Exit the loop. Input length is 0  
                              # ie. The user has pressed Enter
    #
    if [   \( ! "$c" \< "a" -a  ! "$c" \> "z" \) \
        -o \( ! "$c" \< "A" -a  ! "$c" \> "Z" \) ]
    then
        val=($(ascii -s $c)) # build an array of ascii info for this char 
        echo " ... The decimal value of $c is: ${val[1]}"
    else
        echo -n  $'\r \r' # overwrite the invalid character
    fi 
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.