上次更新fortune自定义发现召唤cowsay的bash shell脚本有小概率的bug,就是随机脚本可能超出cows列出图形的数量,这里修补下。
就是随机数超出cowsay图形数就重新调用函数再次生成新的随机数
#!/bin/bash
#将变量声明为整数和数组
declare -i i=1
declare -i n
declare -a animals
# cow文件数
cowLine=$(ls -1 /usr/share/cowsay/cows | wc -l)
# 获取随机数(必须小于cow文件数,否则再次执行)
function nlesscowLine() {
n=$(($(($RANDOM + 1000000000)) % "$1" + 3))
if [[ $n > $1 ]]; then
nlesscowLine $1
fi
}
# 生成cow数组
for animal in $(ls -1 /usr/share/cowsay/cows | sed 's/\.cow$//')
do
animals[$i]=$animal
i=$((i+1))
done
nlesscowLine $cowLine
# 获取随机动物名
ANIMAL=${animals[$n]}
/usr/games/fortune-zh | /usr/games/cowsay -f $ANIMAL
测试执行N次,得到一个例子,如下:
+ declare -i i=1
+ declare -i n
+ declare -a animals
++ ls -1 /usr/share/cowsay/cows
++ wc -l
+ cowLine=49
++ ls -1 /usr/share/cowsay/cows
++ sed 's/\.cow$//'
+ for animal in $(ls -1 /usr/share/cowsay/cows | sed 's/\.cow$//')
+ animals[$i]=apt
+ i=2
+ for animal in $(ls -1 /usr/share/cowsay/cows | sed 's/\.cow$//')
+ animals[$i]=beavis.zen
+ i=3
+ for animal in $(ls -1 /usr/share/cowsay/cows | sed 's/\.cow$//')
+ animals[$i]=bong
...
+ i=49
+ for animal in $(ls -1 /usr/share/cowsay/cows | sed 's/\.cow$//')
+ animals[$i]=www
+ i=50
+ nlesscowLine 49
+ n=50
+ [[ 50 > 49 ]]
+ nlesscowLine 49
+ n=40
+ [[ 40 > 49 ]]
+ ANIMAL=suse
+ /usr/games/fortune-zh
+ /usr/games/cowsay -f suse
__________________________________
/ 一壶酒,一竿身,快活如侬有几人。\
| |
\ -- 李煜《渔父·浪花有意千里雪》 /
----------------------------------
\
\____
/@ ~-.
\/ __ .- |
// // @
程序中cowsay图形文件(cowLine)一共49个,第一次执行nlesscowLine产生随机数n=50,50>49,于是再次执行nlesscowLine 49,产生新的随机数n=40,40 < 49,这个序号在数组中对应的cowsay图形是suse(一个老牌的linux发行商,其logo据说是变色龙)。
PS: 每天都在用Linux办公,每天开启bash无数次,虽然这个概率不大,可都一年多了,也可见我的粗心大意...