Bash脚本 - 根据短字符串

时间:2015-10-19 06:13:51

标签: bash shell imagemagick

我正在使用bash脚本来驱动ImageMagick根据某些输入创建图像。一个输入是一个名为$ {Episode_Number}的短字符串,它将是两个数字,如“16”或两个数字和一个字母,如“16a”。根据这个字符串,我想生成一个0-255的数字。 (这将是Hue-Saturation-Brightness颜色代码中的Hue。)

从字符串中生成数字的最佳方法是什么?任何方法都可以,只要它每次都从同一个字符串产生相同的颜色。

我尝试了$((Episode_Number%255))方法,但这似乎不起作用。

1 个答案:

答案 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 3.x(Mac OSX)

将字符串转换为小写的,,技巧需要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
}