문자의 숫자 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.