shell二位数组——终端字符下降动画
猜想:Shell支持关联数组,可以利用关联数组模拟二维数组。
【验证猜想】
#!/bin/bash array[1,1]=1 array[2,1]=2 array[3,1]=3 for i in `seq 3` do printf "array[%d,%d]=%d\n" $i 1 ${array[$i,1]} done //【运行结果如下】 array[1,1]=3 array[2,1]=3 array[3,1]=3
是否由于逗号引起结果错误?
将array[1,1]替换为array["1,1"](其它类似),结果一样。说明不是因为逗号!
#!/bin/bash array[1,0]=0 array[1,1]=1 array[1,a]=a echo ${array[1,0]},${array[1,1]},${array[1,a]} export array export | grep "array" //运行结果如下 a,1,a export -a array="([0]="a" [1]="1")"
通过上面可以看出,若不显式声明,则数组默认为普通数组,非法的下标被置为0
在man手册中查找得到如下结果
-a Each name is an indexed array variable -A Each name is an associative array variable
即可使用关联数组模拟二维数组
【终端随机字符下降】
shell下通过环境变量$LINES、$COLUMNS获取终端高度、宽度
#!/bin/bash typeset -A array row=$LINES //获取终端宽度 col=$COLUMNS //获取终端高度 function init_array () //初始化array数组 { for i in `seq $row` do for j in `seq $col` do array[$i,$j]=0 done done } function print_line () //打印一条直线 { for i in `seq $col` do printf "-" done } function print_array () { print_array //打印上边框 for i in `seq $row` do for j in `seq $col` do if [ ${array[$i,$j]} -ne 0 ] //若数组元素不为0,则打印对应字符 then printf ${array[$i,$j]} | awk '{printf("%c",$1)}' else printf " " fi done done print_array //打印下边框 } function rand_character { site=$(($(($RANDOM%100))+1)) //产生1-100之间的随机数 t=$(($(($RANDOM%5))+1)) //产生1-5之间的随机数 array[$t,$site]=$(($(($RANDOM%26))+97)) //产生a-z之间的随机字符 } function decline_character { for j in `seq $col` do for i in `seq 2 $row | sort -n -r` //产生$row->2的递减序列 do let m=i-1 if [ ${array[$m,$j]} -ne 0 ] //每列由下向上,若上面元素不为0,则下移1个单位 then array[$i,$j]=${array[$m,$j]} array[$m,$j]=0 //将字符原位置重置为0 fi done done } init_array n=0 while(($n<100)) do clear //清除屏幕 rand_character //产生随机字符 print_array //打印数组 decline_character //下移字符 sleep 0.5 //暂停500毫秒 ((n++)) done
作者:rainmote
博客:http://www.cnblogs.com/rainmote
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。