zoukankan      html  css  js  c++  java
  • 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
    " $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 国际许可协议进行许可。
    欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    [转] 礼物的含义
    刘邦与项羽的关系
    inner join...on和join...on用法
    Oracl常用到问题
    [转] 河南、的女孩好…
    人的痛苦往往在于追求的不是“幸福”,而是“比别人幸福”!
    oracle 基础学习
    WORD文档中的回车符和空格键符如何去掉?
    采用FireFox浏览器进行页面级开发
    Windows Socket Programming 网络编程系列 简单客户端与服务器
  • 原文地址:https://www.cnblogs.com/rainmote/p/4160542.html
Copyright © 2011-2022 走看看