किसी वर्ण के लिए संख्यात्मक 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
मिकेल

1
मैंने od -t d1 की बड़ी कोशिश की ... धन्यवाद
होस्ट पोस्ट

जवाबों:



8

POSIX:

$ printf %d\\n \'a
97

यह भी bash 4.0 में और बाद में और zsh में गैर-ASCII वर्णों के साथ काम करता है:

$ 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(प्रिंट या प्रिंटफ़ की आवश्यकता नहीं है)।
jelmd

3

शायद:

#!/bin/bash

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

चियर्स


मैं बस nkk के बजाय awk का उपयोग करेगा। यह किसी भी awk संस्करण के लिए सुंदर मानक है।
asoundmove

संपादित, मेरी आदत है 'nawk' का उपयोग करने के बाद से मैं काम पर नहीं
जागा

हाँ, आपके समाधान ने मेरे लिए भी काम किया .. धन्यवाद
होस्ट पोस्ट

1

एक ओडी-कम समाधान, बस बैश, और सिर्फ लोअरकेस, अब तक। zचरित्र के लिए खोज की है, यहाँ sखोज के रूप में है। i=97क्योंकि असिसी (ए) = 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
इरिक

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.