获取字符的数字ASCII值


10

我正在尝试编写一个shell脚本,该脚本要求输入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 " "

由于第二个问题是无关的,因此我已将其删除。您应该将其单独张贴(您可以在此处获得原始文本)
Michael Mrozek

您的示例对我有用。您可以粘贴显示发生了什么并描述错误是什么的输出吗?不会echo -n A做你期待什么?如果不是,请尝试printf。不会od -i做你期待什么?如果不是,请尝试od -t d1
Mikel

1
我尝试过od -t d1很好用...谢谢
主持人发表

Answers:


8

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

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

Perl,如果在UTF-8语言环境中,则使用UTF-8: perl -C255 -e 'print ord($ARGV[0])' œ


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(例如,不需要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版本都是相当标准的。
2011年

我习惯使用“ nawk”进行编辑,因为我没有上班的习惯
D4RIO 2011年

是的,您的解决方案也对我有用..谢谢
发表主持人

1

到目前为止,这是一种无od解决方案,只是bash,只有小写字母。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”未找到!
主持人

这在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.