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

简单bash脚本(输入字母输出编号),bash,scripting,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

嗨,我想写一个简单的脚本,它接受一个输入字母并输出它的数字等价物:-

我想把所有的字母都列为变量,然后让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
试试这个:

echo "Input letter"
read letter
result=$(($(printf "%d\n" \'$letter) - 65))
echo $result
0

ASCII中“A”的等效值是65,所以你所要做的就是从你想要检查的字母中去掉65(或者64,如果你想以1开头,而不是0)。对于小写,偏移量将为97。

请尝试以下操作:

echo "Input letter"
read letter
result=$(($(printf "%d\n" \'$letter) - 65))
echo $result
0

ASCII中“A”的等效值是65,所以你所要做的就是从你想要检查的字母中去掉65(或者64,如果你想以1开头,而不是0)。对于小写,偏移量为97。

使用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更改为无符号十进制。

使用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更改为无符号十进制。

一个有趣的错误,滥用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中的一个数字,它由一个包含数字和字母的字符串组成(大小写不重要,因此它也适用于大写字母),带有
36#a=10
36#b=11
,…,
36#z=35
。因此,转换只是减去9的问题


read-n1
仅从标准输入中读取一个字符。
[[$letter=[:alpha:][]&&&$letter=[[:ascii:][]]]
检查
字母是否确实是ascii字母。如果没有
[[:ascii:]
测试,我们将验证像
é
这样的字符(取决于区域设置),这将破坏转换。

一个有趣的问题,滥用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中的一个数字,它由一个包含数字和字母的字符串组成(大小写不重要,因此它也适用于大写字母),带有
36#a=10
36#b=11
,…,
36#z=35
。因此,转换只是减去9的问题


read-n1
仅从标准输入中读取一个字符。
[[$letter=[:alpha:][]&&&$letter=[[:ascii:][]]]
检查
字母是否确实是ascii字母。如果没有
[[:ascii:]
测试,我们将验证像
é
(取决于区域设置)这样的字符,这将破坏转换。

使用这两个函数获取chr和ord:

chr() {
   [ "$1" -lt 256 ] || return 1
   printf "\\$(printf '%03o' "$1")"
}

ord() {
  LC_CTYPE=C printf '%d' "'$1"
}


echo $(chr 97)

a

使用这两个函数获取chr和ord:

chr() {
   [ "$1" -lt 256 ] || return 1
   printf "\\$(printf '%03o' "$1")"
}

ord() {
  LC_CTYPE=C printf '%d' "'$1"
}


echo $(chr 97)

迟到:使用关联数组:

# 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}"

迟到:使用关联数组:

# 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}"

你能发布你拥有的代码吗?你能用示例输入的示例输出告诉我吗?更新了抱歉的家伙:)你从未将NUM设置为任何值。你能发布你拥有的代码吗?你能用示例输入的示例输出告诉我吗?更新了抱歉的家伙:)你从未将NUM设置为任何值。你好,非常感谢。你能更详细地解释一下是什么吗发生什么事了?看这里:。ASCII表是一组符号(字母等)及其数字等价物(计算机中的每个符号都表示为一个数字)。%d定义打印字母的方式-%d表示十进制,因此它将显示为数字。然后,您必须减去65,因为您希望'A'不等于65(再次查看ASCII表),但是0,'B'不等于66,但是1,'C'不等于67,但是2等等。此外,
info printf
读取:*如果数字参数的前导字符为`'或`',则其值是紧跟其后的字符的数值。如果设置了“POSIXLY_CORRECT”环境变量,则任何剩余字符都将被忽略;否则,将打印警告。例如,“printf”%d“\'a”在使用ASCII字符集的主机上输出“97”,因为“a”在ASCII中具有数值97*你好,非常感谢。你能更详细地解释一下发生了什么吗?看这里:。ASCII表是一组符号(字母等)及其数字等价物(计算机中的每个符号都表示为一个数字)。%d定义打印字母的方式-%d表示十进制,因此它将显示为数字。然后,您必须减去65,因为您希望'A'不等于65(再次查看ASCII表),但是0,'B'不等于66,但是1,'C'不等于67,但是2等等。此外,
info printf
读取:*如果数字参数的前导字符为`'或`',则其值是紧跟其后的字符的数值。如果设置了“POSIXLY_CORRECT”环境变量,则任何剩余字符都将被忽略;否则,将打印警告。例如,“printf”%d“\'a”在使用ASCII字符集的主机上输出“97”,因为“a”在ASCII中具有数值97*@gniourf_gniourf Maybeee,我忘了把它改成真的,我现在编辑过:)@gniourf_gniourf Maybeee,我忘了把它改成真的,我现在编辑过:)