我有一个小时记录,其中后续时间从 1 到 9 写为数字,然后写为后续字母字符。我想以正常格式保存时间,因此我需要将字母表中的字母转换为后续数字。
我从文件名中删除了小时、分钟和秒。
endOfFile=${files: -9}
currentTime=${endOfFile%.*}
firstLetter=$(printf %.1s "$currentTime")
echo "$firstLetter"
输出:
1
3
5
7
9
B
D
F
H
J
我如何检查我的变量是否包含数字或字母,如果是字母,则将其替换为适当的数字?
答案1
根据我在评论中的建议:从ascii代码:
- 获取第一个字母的 ascii 代码:(
ord_fl=$(printf %d "'$firstletter")
顺便说一句,前导单引号是有意的) - 减去 55 :
hour=$(($ord_fl-55))
由于大写字母的 ascii 代码按照字母顺序递增,因此从 65(十进制)开始,A 的所需输出应为 10。
Stéphane 在评论中提出的其他可能更好的想法:从 24 进制到十进制的进制转换:
hour=$(( 24#$firstletter ))
注意:确切的语法可能取决于您的 shell。
如果您的 shell 没有实现此类扩展,您始终可以求助于bc
并获取以下输出:
echo "ibase=24; $firstletter" | bc