문자의 숫자 ASCII 값을 얻습니다


10

AZ 또는 az 범위의 ASCII 문자를 요청하고 동등한 숫자 값을 반환하는 쉘 스크립트를 작성하려고합니다. 예를 들어 출력은 다음과 같습니다.

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 " "

두 번째 질문은 관련이 없으므로 편집했습니다. 당신이해야 별도로 게시 (원본 텍스트 얻을 수 있습니다 여기에 )
마이클 Mrozek

당신의 모범은 저에게 효과적입니다. 어떤 일이 발생했는지 보여주는 출력을 붙여넣고 오류가 무엇인지 설명 할 수 있습니까? 당신 echo -n A은 무엇을 기대합니까? 그렇지 않은 경우 printf대신 시도하십시오 . 당신 od -i은 무엇을 기대합니까? 그렇지 않은 경우을 시도하십시오 od -t d1.
Mikel

1
나는 시도했다 -t d1 훌륭하게 작동했습니다 ... 감사합니다
Host Post

답변:


8

POSIX : printf a | od -A n -t d1

펄 : perl -e 'print ord($ARGV[0])' a

UTF-8 로케일 인 경우 UTF-8에 대처하는 Perl : perl -C255 -e 'print ord($ARGV[0])' œ


8

POSIX :

$ printf %d\\n \'a
97

또한 bash 4.0 이상 및 zsh에서 비 ASCII 문자와 함께 작동합니다.

$ printf %x\\n \'あ
3042

recode ..dump16 진 코드 포인트를 보는 데 사용할 수도 있습니다 .

$ 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(print 또는 printf가 필요하지 않음)을 사용할 수도 있습니다.
jelmd

3

아마도:

#!/bin/bash

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

건배


나는 nawk 대신 awk를 사용한다. 이것은 모든 awk 버전의 표준입니다.
asoundmove

편집, 내가 직장에서 awk하지 이후 'nawk'를 사용하는 습관입니다
D4RIO

예, 귀하의 솔루션도 저를 위해 일했습니다 .. thanks
Host Post

1

지금까지 bash와 소문자를 사용하는 od-less 솔루션. z여기서 검색된 문자 s입니다. i=97ascii (a) = 97이기 때문에. 나머지는 분명하다.

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

물론 한 줄에 넣을 수도 있습니다. 여기 몇몇 semmicolons ;;;;;가 있습니다 : (충분해야합니다)


위의 코드를 테스트했지만. 작동하지 않습니다. "i + = 1"을 찾을 수 없다는 메시지가 나타납니다!
호스트 게시물

이것은 bash에서 작동합니다. 대신 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이 있습니다. 배포판은 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.