您好我正在寻找一个简单的脚本,它输入一个输入字母并输出它的等效数字: -
我在考虑将所有字母列为变量,然后让bash将输入作为变量读取,但是从这里开始我很困难,任何帮助都会很棒!
#!/bin/bash
echo "enter letter"
read "LET"
a=1
b=2
c=3
d=4
e=5
f=6
g=7
h=8
i=9
j=10
k=11
l=12
m=13
n=14
o=15
p=16
q=17
r=18
s=19
t=20
u=21
v=22
w=23
x=24
y=25
z=26
LET=${a..z}
if
$LET = [ ${a..z} ];
then
echo $NUM
sleep 5
echo "success!"
sleep 1
exit
else
echo "FAIL :("
exit
fi
答案 0 :(得分:3)
试试这个:
echo "Input letter"
read letter
result=$(($(printf "%d\n" \'$letter) - 65))
echo $result
0
相当于'A'的ASCII是65,所以你要做的就是从你要检查的字母中拿走65(或64,如果你想从1开始,而不是0)。对于小写,偏移量将为97。
答案 1 :(得分:2)
一个有趣的,滥用Bash的基数系统:
read -n1 -p "Type a letter: " letter
if [[ $letter = [[:alpha:]] && $letter = [[:ascii:]] ]]; then
printf "\nCode: %d\n" "$((36#$letter-9))"
else
printf "\nSorry, you didn't enter a valid letter\n"
fi
有趣的部分是$((36#$letter-9))
。 36#
部分告诉Bash将以下字符串理解为基数36中的数字,该数字由包含数字和字母的字符串组成(不重要的情况下,因此它也适用于大写字母),{{1 },36#a=10
,...,36#b=11
。因此,转换只需减去9。
36#z=35
仅从标准输入中读取一个字符。 read -n1
检查[[ $letter = [[:alpha:]] && $letter = [[:ascii:]] ]]
是否真的是ascii字母。如果没有letter
测试,我们会验证像[[:ascii:]]
这样的字符(取决于区域设置),这会使转换陷入困境。
答案 2 :(得分:1)
使用这两个函数来获取chr和ord:
chr() {
[ "$1" -lt 256 ] || return 1
printf "\\$(printf '%03o' "$1")"
}
ord() {
LC_CTYPE=C printf '%d' "'$1"
}
echo $(chr 97)
一
答案 3 :(得分:0)
使用od和tr
echo "type letter: "
read LET
echo "$LET" | tr -d "\n" | od -An -t uC
或使用-n
echo -n "$LET" | od -An -t uC
如果您希望它从a = 1
开始echo $(( $(echo -n "$LET" | od -An -t uC) - 96 ))
输入tr以删除换行符。 使用od更改为无符号小数。
答案 4 :(得分:0)
晚会:使用关联数组:
# require bash version 4
declare -A letters
for letter in {a..z}; do
letters[$letter]=$((++i))
done
read -p "enter a single lower case letter: " letter
echo "the value of $letter is ${letters[$letter]:-N/A}"