那么要如何才能编写出这个特效的圣诞实现圣诞树呢? 下面一口君手把手教大家! 只想运行脚本的同学可以跳到最后面! 变量是节快脚本任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。乐教脚本语言在定义变量时通常不需要指明类型,颗圣直接赋值就可以,诞树Shell 变量也遵循这个规则。圣诞实现Shell 支持以下三种定义变量的节快脚本方式: variable 是变量名,value 是乐教赋给变量的值。如果 value 不包含任何空白符(例如空格、颗圣Tab 缩进等),诞树那么可以不使用引号;如果 value 包含了空白符,圣诞实现那么就必须使用引号包围起来。节快脚本使用单引号和使用双引号也是乐教有区别的,稍后我们会详细说明。颗圣 注意,诞树赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。 Shell 变量的命名规范和大部分编程语言都一样: 使用一个定义过的变量,只要在变量名前面加美元符号$即可,如: 变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界. 如果不给 skill 变量加花括号,写成echo "I am good at $skillScript",解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。 定义变量时,变量的值可以由单引号 包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: 运行结果: 以单引号 包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的香港云服务器场景。 以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。 建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。 trap命令是专用于捕捉信号的。比如像ctrl+c发送给终端的中断信号等等。在捕捉到信号之后,可以进行一系列的操作。 COMMAND表示trap命令接收到INT信号后要执行的动作什么。 可以捕捉的信号有:HUP INT等 不适用捕捉的信号:KILL TERM trap捕捉到信号之后,可以有三种反应方式: 1、源码库执行一段程序来处理这一信号 2、接受信号的默认操作 3、忽视这一信号 它有三种形式分别对应三种不同的信号回应方式 第一种: 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令. 第二种: trap不指定任何命令,接受信号的默认操作.默认操作是结束进程的运行. 第三种: trap命令指定一个空命令串,允许忽视信号. 使用trap -l命令可以查看信号有哪些: 清除终端屏幕 tput 命令将通过 terminfo 数据库对您的终端会话进行初始化和操作。通过使用tput,您可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。 光标属性 文本属性 此外,还可以改变文本的颜色 举例 下面是一个带闪烁功能的时钟 效果 for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。 其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。 for的语法结构如下: 说明: 行1,讲串行中的字段迭代放入变量中 行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段均处理过为止。 举例 用for循环在家目录下创建aaa1-aaa10,然后在aaa1-aaa10创建bbb1-bbb10的目录 列出var目录下各子目录占用磁盘空间的大小。 while循环的语法: 说明: 流程图: 实例 计算1+2+3…………10 还等什么呢?抓紧运行起来吧! 本文转载自微信公众号「一口Linux」一、shell脚本知识
1. shell变量
使用变量
修改变量的值
lin=2 let lin++ 单引号和双引号的区别
2. trap
用法:
trap COMMAND INT 信号回应方式
3. clear
4. tput
5. for循环
6. while循环
二、圣诞树脚本文件
#!/bin/bash #用shell编写一个圣诞树 #创建时间2021-12-23 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++)) { 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) let new_year++ tput setaf 222; tput bold tput cup $lin $((c - 10)); echo $new_year 圣 诞 节 快 乐!!! color=122 tput setaf $color; tput bold tput cup $((lin + 1)) $((c - 10)); echo 关注公众号: 一口Linux! 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 M O N E Y for l in 一 口 Li nu x! do tput cup $((lin+1)) $((c+sh)) echo $l let sh++ let sh++ sleep 0.02 done } k=$((k % 2 + 1)) done 三、执行脚本
root@ubuntu:/home/peng/work/test# chmod 777 peng.sh root@ubuntu:/home/peng/work/test# ./peng.sh