简单的bash脚本(输入字母输出编号)

时间:2014-11-12 13:12:42

标签: bash scripting

您好我正在寻找一个简单的脚本,它输入一个输入字母并输出它的等效数字: -

我在考虑将所有字母列为变量,然后让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

5 个答案:

答案 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}"