流程控制语句 while、case
- while 条件循环语句
- case条件测试语句
- 计划任务服务程序
while 条件循环语句
while 条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于 for 循环语句中有目标、有范围的使用场景。while 循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。while 语句的语法格式如图所示。
vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM %1000)re
TIME=0
echo "商品实际价格为0-999之间, 猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格数目:" INT
let TIMESS++
if [ $INT -eq $PRICE ] ; then
echo "恭喜你答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES次"
exit
elif [ $INT -gt $PRICE ] ; then
echo "太高了"
else
echo "太低了"
fi
done
使用exit结束while循环。
case条件测试语句
case 语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。
接下来我们编写脚本 Checkkeys.sh,提示用户输入一个字符并将其赋值给变量 KEY,然后根据变量 KEY 的值向用户显示其值是字母、数字还是其他字符。
vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "您输入的是 字母"
;;
[0-9])
echo "您输入的是 数字"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
# bash Checkkeys.sh
计划任务服务程序
如何设置服务器的计划任务服务,把周期性、规律性的工作交给系统自动完成。
计划任务分为一次性计划任务与长期性计划任务
➢ 一次性计划任务:今晚 23:30 重启网站服务。
➢ 长期性计划任务:每周一的凌晨 3:25 把/home/wwwroot 目录打包备份为 backup.tar.gz。
一次性计划任务只执行一次,一般用于临时的工作需求。可以用 at 命令实现这种功能,只需要写成“at 时间”的形式就行。如果想要查看已设置好但还未执行的一次性计划任务,可以使用 at -l 命令;要想将其删除,可以使用“atrm 任务序号”。at 命令中的参数及其作用如表 所示。
在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系统设置为在今晚 23:30 自动重启网站服务。
at 23:30
systemctl restart httpd
at -l
可以把前面学习的管道符(任意门)放到两条命令之间,让 at 命令接收前面 echo 命令的输出信息,以达到通过非交互式的方式创建计划一次性任务的目的。
echo "systemctl restart httpd" | at 23:30
at -l
上面设置了两条一样的计划任务,可以使用 atrm 命令轻松删除其中一条:
atrm 2
at -l
这里还有一种特殊场景—把计划任务写入 Shell 脚本中,当用户激活该脚本后再开始倒计时执行,而不是像上面那样在固定的时间(“at 23:30”命令)进行。这该怎么办呢?
一般我们会使用“at now +2 MINUTE”的方式进行操作,这表示 2 分钟(MINUTE)后执行这个任务,也可以将其替代成小时(HOUR)、日(DAY)、月(MONTH)等词汇:
at now + 2 MINUTE
systemctl restart httpd
希望 Linux 系统能够周期性地、有规律地执行某些具体的任务,那么Linux 系统中默认启用的 crond 服务简直再适合不过了。创建、编辑计划任务的命令为 crontab -e,查看当前计划任务的命令为 crontab -l,删除某条计划任务的命令为 crontab -r。另外,如果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。crontab 命令中的参数及其作用如所示。
在正式部署计划任务前,请先跟刘遄老师念一下口诀“分、时、日、月、星期 命令”。这是使用 crond 服务设置任务的参数格式(其格式见表 4-8)。需要注意的是,如果有些字段没有被设置,则需要使用星号( *)占位,如图
假设在每周一、三、五的凌晨 3:25,都需要使用 tar 命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。我们可以使用 crontab -e 命令来创建计划任务,为自己创建计划任务时无须使用-u 参数。crontab –e 命令的具体实现效果和 crontab -l 命令的结果如下所示:
crontab -e
crontab -l
需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的 12~15 日)。还可以用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔 2 分钟执行一次任务)。
如果在 crond 服务中需要同时包含多条计划任务的命令语句,应每行仅写一条。例如我们再添加一条计划任务,它的功能是每周一至周五的凌晨 1 点自动清空/tmp 目录内的所有文件。尤其需要注意的是,在 crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询。rm 命令的路径为下面输出信息中的加粗部分。
whereis rm
crontab -e
crontab -l
总结一下使用计划服务的注意事项。
➢ 在 crond 服务的配置参数中,一般会像 Shell 脚本那样以#号开头写上注释信息,这样在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
➢ 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。
删除 crond 计划任务则非常简单,直接使用 crontab -e 命令进入编辑界面,删除里面的文本信息即可。也可以使用 crontab -r 命令直接进行删除:
crontab -r
crontab -l