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
posted @ 2013-09-17 18:53  雨中尘埃  阅读(358)  评论(0编辑  收藏  举报