在bash shell脚本中使用tr命令将字母转换为数字

fcg9iug3  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(110)
#!/bin/bash
    P="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    C="012345678910111213141516171819202122232425"

    OUT=`echo $1 | tr $P $C`
    echo $OUT

我想把字母表转换成十进制数字,从0开始。我试着像上面提到的代码一样。但是从输入“K”开始,输出是错误的。例如,当我输入DAD时,输出是303,但是当输入KILL时,输出结果是1800,这给了我一个错误的值。K应该被转换成11,但它只取了1。我的代码对2位十进制数不起作用。

jtjikinw

jtjikinw1#

简单的bash解决方案在stdin上采用字母输入-打印每个字母的索引

# fill P array of a-z
P=({a..z})
# fill C map of a-z to index
declare -A C
for((i=0; i < ${#P[*]}; ++i)); do
  C[${P[i]}]=$i
done
# lowercase input
typeset -l line
while IFS= read -r line; do
# print index of each letter in line
  for((i=0; i<${#line}; ++i)); do
    echo -n "${C[${line:i:1}]}"
  done
  echo
done
ybzsozfc

ybzsozfc2#

1输出到26的函数,用于将字母a输出到z以及将字母A输出到Z

reverse_nth_letter(){  # With thanks, https://stackoverflow.com/a/39066314/1208218
  P=({a..z})
  declare -A C
  for((i=0;i<${#P[*]};++i)){ C[${P[i]}]=$i; }
  LETTER="$(echo "${1}" | tr '[:upper:]' '[:lower:]')"
  echo -n "$[ ${C[${LETTER}]} + 1 ]"
}

相关问题