shell脚本打印圣诞树

一、脚本文件

#!/bin/bash
#用shell编写一个圣诞树
#创建时间2021-12-21
#代码片断一
trap "tput reset; tput cnorm; exit" 2
clear
tput civis
lin=2
col=$(($(tput cols) / 2))   //屏幕中间
c=$((col-1))               //屏幕中间往左一位
est=$((c-2))
color=0
tput setaf 2; tput bold

#代码片断二
# 打印树叶
for ((i=1; i<20; i+=2))//用于遍历行
{
    tput cup $lin $col  //用于定位光标到每行的树叶起始位置
    for ((j=1; j<=i; j++))//用于每行的树叶的输出个数(1、3、5....)
    {
        echo -n \*
    }
    let lin++
    let col--   //用于计算出每行树叶的起位置
}

tput sgr0; tput setaf 3

#代码片断三
# 打印树干
for ((i=1; i<=2; i++))
{
    tput cup $((lin++)) $c  //用于定位光标到树干起始位置
    echo '||'
}
new_year=$(date +'%Y')   //当前年份,如2021
let new_year++           //下一年
tput setaf 1; tput bold
tput cup $lin $((c - 6));  echo   圣 诞 节 快 乐!!!//用于在树干开始位置往左移6个位置上输出
tput cup $((lin + 1)) $((c - 10)); echo And lots of CODE in $new_year
let c++
k=1

#装饰一下
while true; do
    for ((i=1; i<=35; i++)) {
        # Turn off the lights
        [ $k -gt 1 ] && {
            tput setaf 2; tput bold
            tput cup ${line[$[k-1]$i]} ${column[$[k-1]$i]}; echo \*
            unset line[$[k-1]$i]; unset column[$[k-1]$i] 
        }

        li=$((RANDOM % 9 + 3))
        start=$((c-li+2))
        co=$((RANDOM % (li-2) * 2 + 1 + start))
        tput setaf $color; tput bold
        tput cup $li $co
        echo o
        line[$k$i]=$li
        column[$k$i]=$co
        color=$(((color+1)%8))
       
        sh=1
        for l in C O D E
        do
            tput cup $((lin+1)) $((c+sh))
            echo $l
            let sh++
            sleep 0.02
        done
    }
    k=$((k % 2 + 1))
done

二、执行脚本

[root@gzy-centos shell]# chmod +x tree.sh 
[root@gzy-centos shell]# ./tree.sh

三、结果展示

shell脚本打印圣诞树

、代码分析

1、片断一

无任何效果

1.1 信号

linux通过信号来在运行在系统上的进程之间通信也可以通过信号来控制shell脚本的运行
(1)捕捉信号:trap命令
常用信号 ctrl+c(终止进程) ctrl+z(暂停进程,打入后台)

[root@server ~]# trap "echo westos" 2
[root@server ~]# ^Cwestos

(2)信号屏蔽

[root@server ~]# trap "" 2	##信号屏蔽
[root@server ~]# trap : 2	##恢复信号

参见shell中trap的作用

1.2 tput命令

tput 可以更改终端功能,如移动或更改光标,更改文本属性,清除终端屏幕的特定区域等。

tput civis # 光标不可见

tput cnorm # 光标可见

tput setaf ColorNumber## 设置前景色

tput bold # 文本加粗

tput cup x y # 光标按设定坐标点移动

tput cup line_number collum_number : 定位光标到 line_number 行,collum_number 列的位置

tput sgr0 # 恢复默认终端

tput lines : 显示终端的行数

tput cols : 显示终端的列数

具体用法参数参见shell 终端terminfo命令 tput

1.3 sleep : 用以实现脚本中延时功能,sleep n,延时 n 秒

1.4 let命令

用于指定算术运算,即 let expretion。

let 表达式

let "表达式"

let '表达式'

i=2
let i+=2
echo $i

a=2
let "a+=1"
echo "a+=1 is $a"

1.5 date命令

%Y : 完整年份 (0000..9999)

[root@localhost home]# date +'%Y'
2021

2、片断二

3、片断三

 

4、片断四

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值