отримати числове значення 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.
Мікель

1
Я спробував od -t d1 працював чудово ... Спасибі
Повідомлення хоста

Відповіді:



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", оскільки я не
прокидаюся

так, ваше рішення спрацювало і для мене .. дякую
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

Ви можете поставити його в єдиний рядок звичайно. Ось кілька крапок з комою: ;;;;;(має бути достатньо)


Я перевірив вищевказаний код .. але він не працював для мене .. Я отримав повідомлення про те, що "i + = 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що робить це. Ваш дистриб'ютор може запропонувати його вже як пакет, якщо не дістанеться з 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.