一、脚本文件
#!/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
三、结果展示
四、代码分析
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 ##恢复信号
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、片断四