4.2 编写Shell脚本
4.2.3 判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。
&& 当前面的命令成立时,执行后面的语句;
|| 当前面个的命令不成立时,执行后main的语句;
! 表示把条件测试中的判断结果取相反值;
*可用的整数比较运算符*
[root@linuxprobe ~]# [ 10 -gt 10 ] [root@linuxprobe ~]# echo $? 1 [root@linuxprobe ~]# [ `free -m | grep Mem: | awk '{print $4}'` -le 1024 ] && echo "Error" || echo "OK" OK
4.3 流程控制语句
4.3.1 if条件测试语句
[root@linuxprobe ~]# vim mkcdrom.sh #!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then mkdir -p $DIR fi
[root@linuxprobe ~]# vim chkhost.sh #!/bin/bash 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
[root@linuxprobe ~]# vim chkscore.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 [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):88 88 is Excellent [root@linuxprobe ~]# bash chkscore.sh Enter your score(0-100):80 80 is Pass
4.3.2 for条件循环语句
[root@linuxprobe ~]# vim Example.sh #!/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
注:/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
4.3.3 while条件循环语句
while条件循环语句:让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数;
for循环语句:用在有目标、有范围的使用场景。
[root@linuxprobe ~]# vim Guess.sh #!/bin/bash PRICE=$(expr $RANDOM % 1000) TIMES=0 echo "商品实际价格为0-999之间,猜猜看是多少?" while truedo read -p "请输入您猜测的价格数目:" INT let TIMES++ if [ $INT -eq $PRICE ] ; then echo "恭喜您答对了,实际价格是 $PRICE" echo "您总共猜测了 $TIMES 次" exit 0 elif [ $INT -gt $PRICE ] ; then echo "太高了!" else echo "太低了!" fi done
expr 用于计算;
4.3.4 case条件测试语句
[root@linuxprobe ~]# vim Checkkeys.sh #!/bin/bash read -p "请输入一个字符,并按Enter键确认:" KEY case "$KEY" in [a-z]|[A-Z]) echo "您输入的是 字母。" ;; [0-9]) echo "您输入的是 数字。" ;; *) echo "您输入的是 空格、功能键或其他控制字符。" esac [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:6 您输入的是 数字。 [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:p 您输入的是 字母。 [root@linuxprobe ~]# bash Checkkeys.sh 请输入一个字符,并按Enter键确认:^[[15~ 您输入的是 空格、功能键或其他控制字符。
4.4 计划任务服务程序
4.4.1 at命令
一次性计划任务只执行一次,一般用于满足临时的工作需求。在使用at命令来设置一次性计划任务时,默认采用的是交互式方法。
命令形式:at 时间;
"at -l”命令:查看已设置好但还未执行的一次性计划任务;
“atrm 任务序号" :删除计划任务;
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 job 4 at Mon Apr 27 23:30:00 2015 [root@linuxprobe ~]# at -l 3 Mon Apr 27 23:30:00 2016 a root 4 Mon Apr 27 23:30:00 2016 a root [root@linuxprobe ~]# atrm 3 #删除job 3 [root@linuxprobe ~]# at -l 4 Mon Apr 27 23:30:00 2016 a root
4.4.2 crontab命令
crond服务设置任务的参数格式口诀“分、时、日、月、星期 命令”
*使用crond设置任务的参数字段说明*
字段 | 说明 |
分钟 | 取值为0~59的整数 |
小时 | 取值为0~23的任意整数 |
日期 | 取值为1~31的任意整数 |
月份 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
[root@linuxprobe ~]# crontab -e #编辑新建任务,调用VIM编辑器进行任务编辑,可以使用#写注释 no crontab for root - using an empty one crontab: installing new crontab [root@linuxprobe ~]# crontab -l #查看 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot [root@linuxprobe ~]# crontab -r #删除任务
注:除了用逗号(,)来分别表示多个时间段,例如“8,9,12”表示8月、9月和12月。还可以用减号(-)来表示一段连续的时间周期(例如字段“日”的取值为“12-15”,则表示每月的12~15日)。以及用除号(/)表示执行任务的间隔时间(例如“*/2”表示每隔2分钟执行一次任务)。