我正在使用bash脚本来驱动ImageMagick根据某些输入创建图像。一个输入是一个名为$ {Episode_Number}的短字符串,它将是两个数字,如“16”或两个数字和一个字母,如“16a”。根据这个字符串,我想生成一个0-255的数字。 (这将是Hue-Saturation-Brightness颜色代码中的Hue。)
从字符串中生成数字的最佳方法是什么?任何方法都可以,只要它每次都从同一个字符串产生相同的颜色。
我尝试了$((Episode_Number%255))方法,但这似乎不起作用。
答案 0 :(得分:1)
此功能将处理01至31g的节目编号:
tonum() {
a=${1,,}
n=${a:0:2}
[ "${#a}" -eq 3 ] && ((n+=32*($(printf "%d" "'${a:2}") - 96)))
echo $n
}
示例:
$ tonum 01
1
$ tonum 01a
33
$ tonum 31g
255
显示数字00到31分配给值0到31.显示数字00a到31a分配给32到63. 00b到31b分配给64到95.依此类推。
a=${1,,}
这会将函数的第一个参数转换为小写,并将其赋值给变量a
。这使得函数不区分大小写。
((n=${a:0:2}))
这会占用a
的前两个字符,并将它们分配给变量n
。
[ "${#a}" -eq 3 ] && ((n+=32*($(printf "%d" "'${a:2}") - 96)))
如果变量a
有三个字符,则会将第三个字符转换为数字,将其乘以32,然后将结果添加到n
。
这使用printf
的功能将字母转换为数字。例如:
$ printf "%d" "'a"
97
小写a
变为97.小写b
变为98,依此类推。我们从中减去96,以便a
变为1.然后,我们将其乘以32以获得我们要添加到n
的数字。
echo $n
这会将结果显示给stdout。
将字符串转换为小写的,,
技巧需要bash 4.0或更高版本。对于使用旧版本bash的平台,我们可以对tr
执行相同的操作:
tonum() {
a=$(echo "$1" | tr '[:upper:]' '[:lower:]')
n=${a:0:2}
[ "${#a}" -eq 3 ] && ((n+=32*($(printf "%d" "'${a:2}") - 96)))
echo $n
}