【问题标题】:Simple bash script (input letter output number)简单的 bash 脚本(输入字母输出数字)
【发布时间】:2015-03-15 00:46:27
【问题描述】:

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

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

【问题讨论】:

  • 你能把你的代码贴出来吗?
  • 你能用示例输入和示例输出来判断吗?
  • 更新了对不起各位:)
  • 您从未将 NUM 设置为任何值。

标签: bash scripting


【解决方案1】:

试试这个:

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

0

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

【讨论】:

  • 您好,非常感谢,您能更详细地解释发生了什么吗?
  • 看这里:asciitable.com/index/asciifull.gif。 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。*
【解决方案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 中的数字,该数字由包含数字和字母的字符串组成(大小写不重要,因此它也适用于大写字母),36#a=10, @ 987654325@,……,36#z=35。所以转换只是减去 9 的问题。

read -n1 只从标准输入中读取一个字符。 [[ $letter = [[:alpha:]] && $letter = [[:ascii:]] ]] 检查 letter 是否真的是一个 ascii 字母。如果没有 [[:ascii:]] 测试,我们将验证像 é 这样的字符(取决于语言环境),这会打乱转换。

【讨论】:

    【解决方案3】:

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

    chr() {
       [ "$1" -lt 256 ] || return 1
       printf "\\$(printf '%03o' "$1")"
    }
    
    ord() {
      LC_CTYPE=C printf '%d' "'$1"
    }
    
    
    echo $(chr 97)
    

    一个

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • @gniourf_gniourf Maybeeee,我忘了把它改成真实的,我现在已经编辑了:)
      【解决方案5】:

      迟到:使用关联数组:

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

      【讨论】:

        猜你喜欢
        • 2017-11-21
        • 2017-12-08
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        相关资源
        最近更新 更多