从零开始的Linux学习

2020.5.10-第六天

碎碎念:shell脚本虽然难理解,但敲起来还是挺好玩的,那么,紧接上文。

一、流程控制语句(if、for、while、case)

1for条件循环语句,允许脚本一次性读取多个信息,然后逐一对信息进行操作处理,当要处理的数据有范围时,使用for循环语句再适合不过了:.
从零开始的Linux学习:2020.5.10-第六天
从零开始的Linux学习:2020.5.10-第六天

在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码;从“cat”命令读取user.txt文件的内容,然后赋值到UNAME变量;在执行该脚本后,会自动使用从列表文件users.txt中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成功,也就是判断该用户是否已经存在(批量创建用户);
从零开始的Linux学习:2020.5.10-第六天

让脚本从主机列表文件ipadds.txt中自动读取IP地址(用来表示主机)并将其赋值给HLIST变量,从而通过判断ping命令执行后的返回值来逐个测试主机是否在线。脚本中出现的$(命令)是一种完全类似于第3章的转义字符中反引号命令的Shell操作符,效果同样是执行括号或双引号括起来的字符串中的命令。
“for IP in cat ipadd.txt”从cat ipadd.txt返回的值定义一个变量“IP”。

2.while 条件循环语句,是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于for循环语句中有目标、有范围的使用场景。while循环语句通过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环:
从零开始的Linux学习:2020.5.10-第六天
从零开始的Linux学习:2020.5.10-第六天
结合使用多分支的if条件测试语句与while条件循环语句,编写一个用来猜测数值大小的脚本Guess.sh。该脚本使用$RANDOM变量来调取出一个随机的数值(范围为0~32767),将这个随机数对1000进行取余操作,并使用expr命令取得其结果,再用这个数值与用户通过read命令输入的数值进行比较判断。这个判断语句分为三种情况,分别是判断用户输入的数值是等于、大于还是小于使用expr命令取得的数值(“exit 0”的“0”是 返回值,让脚本更完善;“let TIMS++”相当于“TIMES=TIMS+1”)。当前,现在这些内容不是重点,我们当前要关注的是while条件循环语句中的条件测试始终为true,因此判断语句会无限执行下去,直到用户输入的数值等于expr命令取得的数值后,这两者相等之后才运行exit 0命令,终止脚本的执行(不能输入字母,不然会报错);从零开始的Linux学习:2020.5.10-第六天
当用户输入非数字字符时,会提示报错信息。

3.case 条件测试语句,case语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令:
从零开始的Linux学习:2020.5.10-第六天
从零开始的Linux学习:2020.5.10-第六天
“[a-z] | [A-Z]”中的“|”代表或而不是管道符,如果没有“|”的话,则需要输入一个小写字母和一个大写字母,这样程序才不会报错;如果写在一起,格式为“[a-z,A-Z]”;不过这样写会不区分大小写的,即使将“[a-z]”跟“[A-Z]”分成两组:
从零开始的Linux学习:2020.5.10-第六天
所以之后我找到了用特殊符号代替大小写字母的方法:
从零开始的Linux学习:2020.5.10-第六天

通过在脚本中组合使用case条件测试语句和通配符(详见第3章),完全可以满足这里的需求。接下来我们编写脚本Checkkeys.sh,提示用户输入一个字符并将其赋值给变量KEY,然后根据变量KEY的值向用户显示其值是字母、数字还是其他字符。
特殊符号表:
从零开始的Linux学习:2020.5.10-第六天

二、计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务:
1.一次性计划任务只执行一次(单次有效性计划):
可以用at命令实现这种功能,只需要写成“at 时间”的形式就可以。”。在使用at命令来设置一次性计划任务时,默认采用的是交互式方法:
从零开始的Linux学习:2020.5.10-第六天
今晚8点自动重启(为结束此次编写的符号,用ctrl+d);
如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号:
从零开始的Linux学习:2020.5.10-第六天
如果要查看计划内容,可以使用“at -c 任务序号”:
从零开始的Linux学习:2020.5.10-第六天
2.希望Linux系统能够周期性地、有规律地执行某些具体的任务,那么Linux系统中默认启用的crond服务简直再适合不过了。创建、编辑计划任务的命令为“crontab -e”,查看当前计划任务的命令为“crontab -l”,删除某条计划任务的命令为“crontab -r”。另外,如果您是以管理员的身份登录的系统,还可以在crontab命令中加上-u参数来编辑他人的计划任务:
从零开始的Linux学习:2020.5.10-第六天
因为linuxprobe用户没有计划,所以显示失败;
如果需要执行多条命令,直接在下一行写入即可:
从零开始的Linux学习:2020.5.10-第六天
3.在正式部署计划任务前,请先跟念一下口诀“分、时、日、月、星期 命令”。这是使用crond服务设置任务的参数格式(其格式见表1)。需要注意的是,如果有些字段没有设置,则需要使用星号(*)占位,如下图所示:
从零开始的Linux学习:2020.5.10-第六天
从零开始的Linux学习:2020.5.10-第六天
日期跟星期不要同时写。
命令一定得要绝对路径的方式来写,可以使用“whereis”命令进行查询:
从零开始的Linux学习:2020.5.10-第六天
以下为课堂小例子:

从零开始的Linux学习:2020.5.10-第六天
每年9月5号的凌晨3点30分重启服务器;
从零开始的Linux学习:2020.5.10-第六天
每年9月的星期二的凌晨3点30分重启服务器;
从零开始的Linux学习:2020.5.10-第六天
每个星期二的凌晨3点30分重启服务器;

需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。以及用除号(/)表示执行任务的间隔时间(例如“/2”表示每隔2分钟执行一次任务):
从零开始的Linux学习:2020.5.10-第六天
每隔2个小时的30分(1点30分的两小时后3点30分),便会重启服务器(“/n”在哪个“
”后面,就表示每隔n“分/时/天/月/星期”);
从零开始的Linux学习:2020.5.10-第六天
每月的3-5号(3、4、5号)的凌晨2点30分重启服务器;
从零开始的Linux学习:2020.5.10-第六天
每月的3、5、7号的凌晨2点30分重启服务器;
从零开始的Linux学习:2020.5.10-第六天
每隔两小时的每过2分钟。

相关文章: