4.2 编写Shell脚本

4.2.3 判断用户的参数

第四章学习笔记_笔记

Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。

&& 当前面的命令成立时,执行后面的语句;

|| 当前面个的命令不成立时,执行后main的语句;

! 表示把条件测试中的判断结果取相反值;

*可用的整数比较运算符*

操作符

作用

-eq

是否等于

-ne

是否不等于

-gt

是否大于

-lt

是否小于

-le

是否等于或小于

-ge

是否大于或等于

[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条件测试语句

第四章学习笔记_笔记_02第四章学习笔记_Linux_03

[root@linuxprobe ~]# vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi


第四章学习笔记_Linux_04

[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


第四章学习笔记_Linux_05

[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条件循环语句

第四章学习笔记_Linux_06


[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循环语句:用在有目标、有范围的使用场景。

第四章学习笔记_笔记_07

[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条件测试语句

第四章学习笔记_Linux_08

[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命令

第四章学习笔记_第四章_09

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分钟执行一次任务)。