получить числовое значение 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 " "

Я отредактировал твой второй вопрос, поскольку он не был связан; Вы должны опубликовать это отдельно (вы можете получить оригинальный текст здесь )
Майкл Мрозек

Ваш пример работает на меня. Можете ли вы вставить вывод, показывающий, что происходит, и описать, в чем заключается ошибка? Делает ли echo -n Aто, что вы ожидаете? Если нет, попробуйте printfвместо этого. Делает ли od -iто, что вы ожидаете? Если нет, попробуйте od -t d1.
Микель

1
Я попытался od -t d1 работал отлично ... Спасибо
Сообщение от Host

Ответы:



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(print или 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', так как я не работаю на работе
D4RIO

да, ваше решение сработало для меня тоже .. спасибо
Host Post

1

Решение без шансов, просто bash и просто строчные, пока. zэто искомый символ, здесь sкак поиск. i=97потому что ASCII (а) = 97. Остальное очевидно.

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

Вы можете поместить это в одну строку, конечно. Вот несколько точек с запятой: ;;;;;(должно быть достаточно)


Я протестировал приведенный выше код ... но он не сработал для меня ... Я получил сообщение о том, что "i + = 1" не найден!
Сообщение от Host

Это работает в Bash. Вместо этого вам может понадобиться i = $ ((i + 1)).
пользователь неизвестен

В одну строку и с чтением клавиши с клавиатуры:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
Эрик

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.