Linux学习笔记(11)——流程控制语句与计划任务服务程序

  • if条件测试语句

if 条件语句的单分支结构由 if、then、fi 关键词组成,而且只在条件成立后才执行预设的
命令,相当于口语的“如果…那么…”。
下面使用单分支的 if 条件语句来判断/media/cdrom 文件是否存在,若存在就结束条件判
断和整个 Shell 脚本,反之则去创建这个目录:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

这里继续用“bash 脚本名称”的方式来执行脚本。在正常情况下,顺利执行完脚本文件后没有任何输出信息,但是可以使用 ls 命令验证/media/cdrom 目录是否已经成功创建:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash mkcdrom.sh
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ ls -d /media/cdrom
/media/cdrom

if 条件语句的双分支结构由 if、then、else、fi 关键词组成,它进行一次条件匹配判断,如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令,相当于口语的“如果…那么…或者…那么…”。

下面使用双分支的 if 条件语句来验证某台主机是否在线,然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息。这里的脚本主要使用 ping 命令来测试与对方主机的网络联通性,而 Linux 系统中的 ping 命令不像 Windows 一样尝试 4 次就结束,因此为了避免用户等待时间过长,需要通过-c 参数来规定尝试的次数,并使用-i 参数定义每个数据包的发送间隔,以及使用-W 参数定义等待超时时间。

#!/bin/bash
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim chkhost.sh
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi

这里的服务器 IP 地址为 172.20.42.13,我们来验证一下脚本的效果:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash chkhost.sh 172.20.42.13
Host 172.20.42.13 is On-line.
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash chkhost.sh 172.20.42.14
Host 172.20.42.14 is Off-line.

if 条件语句的多分支结构由 if、then、else、elif、fi 关键词组成,它进行多次条件匹配判
断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令,相当于口语的“如果…那么…如果…那么…”。
在这里插入图片描述下面使用多分支的 if 条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如Excellent、Pass、Fail 等提示信息。
在 Linux 系统中,read 是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p 参数用于向用户显示一定的提示信息。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim chkhost.sh
#!/bin/bash
read -p "Enter your score (0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "GRADE is Pass"
else
echo "$GRADE is Fail"
fi
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash chkhost.sh 
Enter your score (0-100): 88
GRADE is Excellent
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash chkhost.sh 
Enter your score (0-100): 80
GRADE is Pass
  • for条件循环语句

在这里插入图片描述下面使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。首先创建用户名称的列表文件 users.txt,每个用户名称单独一行。读者可以自行决定具体的用户名称和个数:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim chkhost.sh 
andy
barry
carl
duke
eric
george

接下来编写 Shell 脚本 Example.sh。在脚本中使用 read 命令读取用户输入的密码值,然
后赋值给 PASSWD 变量,并通过-p 参数向用户显示一段提示信息,告诉用户正在输入的内容
即将作为账户密码。在执行该脚本后,会自动使用从列表文件 users.txt 中获取到所有的用户
名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成
功,也就是判断该用户是否已经存在。
/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。

#!/bin/bash
read -p "Enter The Users Password: " PASSWD
for UNAME in 'cat users.txt'
do      
id $UNAME &> /dev/null
if [ $? -eq 0 ] 
then    
echo "Already exists"
else    
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null     
if [ $? -eq 0 ]
then    
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done

在 Linux 系统中,/etc/passwd 是用来保存用户账户信息的文件。如果想确认这个脚本是
否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash example.sh
Enter The Users Password: linuxprobe 
andy , Create success
barry , Create success
carl , Create success
duke , Create success
eric , Create success
george , Create success
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ tail -6 /etc/passwd
andy:x:1001:1001::/home/andy:/bin/bash
barry:x:1002:1002::/home/barry:/bin/bash
carl:x:1003:1003::/home/carl:/bin/bash
duke:x:1004:1004::/home/duke:/bin/bash
eric:x:1005:1005::/home/eric:/bin/bash
george:x:1006:1006::/home/george:/bin/bash

现在尝试让脚本从文本中自动读取主机列表,然后自动逐个测试这些主机是否在线。
首先创建一个主机列表文件 ipadds.txt:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim idadds.txt
192.168.10.10
192.168.10.11
192.168.10.12

然后前面的双分支 if 条件语句与 for 循环语句相结合,让脚本从主机列表文件 ipadds.txt中自动读取 IP 地址(用来表示主机)并将其赋值给 HLIST 变量,从而通过判断 ping 命令执行后的返回值来逐个测试主机是否在线。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim CheckHost.sh
#!/bin/bash
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash CheckHost.sh 
Host 192.168.10.10 is Off-line.
Host 192.168.10.11 is Off-line.
Host 192.168.10.12 is Off-line.
  • while条件循环语句

在这里插入图片描述接下来编写一个用来猜测数值大小的脚本 Guess.sh。该脚本使用$RANDOM 变量来调取出一个随机的数值(范围0~32767),将这个随机数对 1000 进行取余操作,并使用 expr 命令取得其结果,再用这个数值与用户通过 read命令输入的数值进行比较判断。这个判断语句分为三种情况,分别是判断用户输入的数值是等于、大于还是小于使用 expr 命令取得的数值。while 条件循环语句中的条件测试始终为 true,因此判断语句会无限执行下去,直到用户输入的数值等于 expr 命令取得的数值后,这两者相等之后才运行 exit 0 命令,终止脚本的执行。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为0-999之间,猜猜看是多少?"
while true
do
read -p "请输入您猜的价格数目: " INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIME 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
if
done

在这个 Guess.sh 脚本中,我们添加了一些交互式的信息,从而使得用户与系统的互动性得以增强。而且每当循环到 let TIMES++命令时都会让 TIMES 变量内的数值加 1,用来统计循环总计执行了多少次。这可以让用户得知总共猜测了多少次之后,才猜对价格。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash Guess.sh 
商品实际价格为0-999之间,猜猜看是多少?
请输入您猜的价格数目: 900
太高了!
请输入您猜的价格数目: 800
太高了!
请输入您猜的价格数目: 600
太高了!
请输入您猜的价格数目: 400
太高了!
请输入您猜的价格数目: 300
太高了!
请输入您猜的价格数目: 200
太低了!
请输入您猜的价格数目: 205
太低了!
请输入您猜的价格数目: 250
太低了!
请输入您猜的价格数目: 260
太低了!
请输入您猜的价格数目: 270
太低了!
请输入您猜的价格数目: 280
太低了!
请输入您猜的价格数目: 290
太高了!
请输入您猜的价格数目: 285
恭喜您答对了,实际价格是 285
您总共猜测了 13 次
  • case条件测试语句

case 语句是在多个范围内匹配数据,若匹配成功则执行相关命令并结束整个条件测试;而如果数据不在所列出的范围内,则会去执行星号(*)中所定义的默认命令。
在这里插入图片描述
接下来我们编写脚本 Checkkeys.sh,提示用户输入一个字符并将其赋值给变量 KEY,然后根据变量 KEY 的值向用户显示其值是字母、数字还是其他字符。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符。"
esac
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash Checkkeys.sh 
请输入一个字符,并按Enter键确认:6
您输入的是 数字。
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash Checkkeys.sh 
请输入一个字符,并按Enter键确认:p
您输入的是 字母。
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash Checkkeys.sh 
请输入一个字符,并按Enter键确认:~`12
您输入的是 空格、功能键或其他控制字符。
  • 计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务,可以按照如下方式理解。
➢ 一次性计划任务:今晚 11 点 30 分开启网站服务。
➢ 长期性计划任务:每周一的凌晨 3 点 25 分把/home/wwwroot 目录打包备份为backup.tar.gz。

一次性计划任务:用 at命令实现这种功能,只需要写成“at 时间”的形式就可以。如果想要查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令;要想将其删除,可以用“atrm 任务序号”。在使用 at 命令来设置一次性计划任务时,默认采用的是交互式方法。例如,使用下述命令将系统设置为在今晚 23:30 分自动重启网站服务。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ at 23:30
at> systemctl restart httpd
at> 此处请同时按下 Ctrl + D 组合键来结束编写计划任务
job 2 at Sat Jun  8 23:30:00 2019
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ at -l
1	Sat Jun  8 23:30:00 2019 a zoupeng
2	Sat Jun  8 23:30:00 2019 a zoupeng

把管道符(任意门)放到两条命令之间,让 at 命令接收前面 echo 命令的输出信息,以达到通过非交互式的方式创建计划一次性任务的目的。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo "systemctl restart httpd" | at 23:30
warning: commands will be executed using /bin/sh
job 3 at Sat Jun  8 23:30:00 2019
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ at -l
1	Sat Jun  8 23:30:00 2019 a zoupeng
3	Sat Jun  8 23:30:00 2019 a zoupeng
2	Sat Jun  8 23:30:00 2019 a zoupeng

如果我们不小心设置了两个一次性计划任务,可以使用下面的命令轻松删除:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ atrm 3
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ atrm 2
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ at -l
1	Sat Jun  8 23:30:00 2019 a zoupeng

Linux 系统中默认启用的 crond 服务能够周期性地、有规律地执行某些具体的任务。
创建、编辑计划任务的命令为“crontab -e”。
查看当前计划任务的命令为“crontab -l”。
删除某条计划任务的命令为“crontab -r”。
如果是以管理员身份登录系统,可以在 crontab 命令中加上-u 参数来编辑他人的计划任务。

“分、时、日、月、星期 命令”。这是使用 crond 服务设置任务的参数格式,如果有些字段
没有设置,则需要使用星号(*)占位。
在这里插入图片描述

字段说明
取值为0-59的整数
取值为0-23的任意整数
取值为1-31的任意整数
取值为1-12的任意整数
星期取值为0-7的任意整数,其中0与7均为星期日
命令要执行的脚本或程序命令

假设在每周一、三、五的凌晨 3 点 25 分,都需要使用 tar 命令把某个网站的数据目录进
行打包处理,使其作为一个备份文件。我们可以使用 crontab -e 命令来创建计划任务。为自己创建计划任务无需使用-u 参数,具体的实现效果的参数如 crontab -l 命令结果所示:

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ crontab -e
25 3 * * 1,3,5 /user/bin/tar -czvf backup.tar.gz /home/wwwroot
crontab: installing new crontab
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ crontab -l
25 3 * * 1,3,5 /user/bin/tar -czvf backup.tar.gz /home/wwwroot

需要说明的是,除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示 8 月、9 月和 12 月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15 日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2 分钟执行一次任务)。
在 crond 服务中需要同时包含多条计划任务命令语句应每行仅写一条。例如我们再添加一条计划任务,它的功能是每周一至周五的凌晨 1 点钟自动清空/tmp 目录内的所有文件。在crond 服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用 whereis 命令进行查询,rm 命令路径为下面输出信息中加粗部分。

zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ whereis rm
rm: /bin/rm /usr/share/man/man1/rm.1.gz
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ crontab -e
25 3 * * 1,3,5 /user/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 rm: /bin/rm /usr/share/man/man1/rm.1.gz /tmp/*
crontab: installing new crontab
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ crontab -l
25 3 * * 1,3,5 /user/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 rm: /bin/rm /usr/share/man/man1/rm.1.gz /tmp/*

使用计划服务的注意事项。
➢ 在 crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,这样
在日后回顾这段命令代码时可以快速了解其功能、需求以及编写人员等重要信息。
➢ 计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字
段不能同时使用,否则就会发生冲突。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值