karakter için sayısal ASCII değeri al


10

AZ veya az aralığında bir ASCII karakteri soran ve eşdeğer sayısal değerini döndüren bir kabuk komut dosyası yazmaya çalışıyorum. Örneğin, çıktı aşağıdaki gibi görünebilir:

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

Girişimim:

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

İlginizi çekmediği için ikinci sorunuzu düzenledim; Eğer gereken ayrı olarak gönderebilir (orijinal metnin alabilirsiniz burada )
Michael Mrozek

Örneğin benim için çalışıyor. Ne olduğunu gösteren çıktıyı yapıştırabilir ve hatanın ne olduğunu açıklayabilir misiniz? Ne echo -n Abekliyorsun? Değilse, printfbunun yerine deneyin . Ne od -ibekliyorsun? Değilse, deneyin od -t d1.
Mikel

1
Od -t d1 harika çalıştı çalıştı ... Teşekkürler
Host Post

Yanıtlar:


8

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

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

Perl, UTF-8 yerel ayarındaysa UTF-8 ile başa çıkmak: perl -C255 -e 'print ord($ARGV[0])' œ


8

POSIX:

$ printf %d\\n \'a
97

Ayrıca bash 4.0 ve sonraki sürümlerde ve zsh'de ASCII olmayan karakterlerle çalışır:

$ printf %x\\n \'あ
3042

recode ..dumpOnaltılık kod noktalarını görmek için de kullanabilirsiniz :

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

0061   a     latin small letter a
3042   a5    hiragana letter a

2
Biraz daha az "belirsiz" hale getirmek için, örneğin örneğin A=a ; printf '%d\n' "'$A'"ve ksh'da A=a; integer N=$(("'$A'")); print $N(print veya printf gerekli değildir) kullanılabilir.
jelmd

3

Olabilir:

#!/bin/bash

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

Şerefe


Ben sadece nawk yerine awk kullanırdım. Bu herhangi bir awk sürümü için oldukça standarttır.
11'te asoundmove

Düzenlendi, ben işte awk değil beri 'nawk' kullanma alışkanlık olduğunu
D4RIO

evet, çözümünüz de benim için çalıştı .. teşekkürler
Host Post

1

Şimdiye kadar sadece basit bir çözüm, sadece bash ve sadece küçük harf. zburada s, arama olarak aranan karakterdir . i=97çünkü ascii (a) = 97. Gerisi açık.

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

Elbette tek bir satıra koyabilirsiniz. İşte bazı noktalı virgüller: ;;;;;(yeterli olmalı)


Yukarıdaki kodu test ettim .. ama benim için işe yaramadı .. "i + = 1" bulunamadı mesajını aldım!
Ev Sahibi Mesaj

Bu bash'da çalışır. Bunun yerine i = $ ((i + 1)) gerekebilir.
kullanıcı bilinmiyor

Bir satırda ve klavyeden bir anahtar okurken:read char; i=97; for c in {a..z}; do [ "$c" = "$char" ] && echo $i && break || ((i+=1)); done
erik

0

od -t d1Eğer varsa deneyin . Diğer çıktı formatları oldukça garip.

Ayrıca kafa ve kesime de ihtiyacınız yoktur, örneğin:

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


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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.