1. 接受用户的参数

1 $0 //第几个参数 2 $# //参数总长度 3 $* //分别有什么 4 5 6 [root@localhost ~]# cat example.sh 7 #!/bin/bash 8 echo "当前脚步名称为$0" 9 echo "总共有$#个参数,分别是$*" 10 echo "第一个参数为$1,第5个为$5" 11 12 [root@localhost ~]# bash example.sh one two three four five six 13 当前脚步名称为example.sh 14 总共有6个参数,分别是one two three four five six 15 第一个参数为one,第5个为five
2. 判断用户的参数

按照测试对象来划分,条件测试语句可以分为4种:
2.1 文件测试语句;
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符
文件测试所用的参数
| 操作符 | 作用 |
| -d | 测试文件是否为目录类型 |
| -e | 测试文件是否存在 |
| -f | 判断是否为一般文件 |
| -r | 测试当前用户是否有权限读取 |
| -w | 测试当前用户是否有权限写入 |
| -x | 测试当前用户是否有权限执行 |
1 Shell解释器的内设$?变量显示上一条命令执行后的返回值 2 如果返回值为0,则目录存在;如果返回值为非零的值, 3 则意味着它不是目录,或这个目录不存在: 4 [root@localhost ~]# [ -d /etc/fstab ] 5 [root@localhost ~]# echo $? 6 1
1 判断/etc/fstab是否为一般文件, 2 如果返回值为0,则代表文件存在,且为一般文件 3 [root@localhost ~]# [ -f /etc/fstab ] 4 [root@localhost ~]# echo $? 5 0
1 逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。 2 例如在Shell终端中逻辑“与”的运算符号是&&, 3 它表示当前面的命令执行成功后才会执行它后面的命令, 4 因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样 5 6 [root@localhost ~]# [ -e /dev/cdrom ] && echo "Exist" 7 Exist
1 在Linux系统中的运算符号为||, 2 表示当前面的命令执行失败后才会执行它后面的命令, 3 因此可以用来结合系统环境变量USER来 4 判断当前登录的用户是否为非管理员身份 5 6 [root@localhost ~]# echo $USER 7 root 8 [root@localhost ~]# [ $USER = root ] || echo "user" 9 [root@localhost ~]# su linuxprobe 10 [linuxprobe@localhost root]$ [ $USER = root ] || echo "user" 11 user
1 在Linux系统中的运算符号是一个叹号(!), 2 它表示把条件测试中的判断结果取相反值。也就是说, 3 如果原本测试的结果是正确的,则将其变成错误的; 4 原本测试错误的结果,则将其变成正确的。 5 6 [root@localhost ~]# [ ! $USER = root ] || echo "administrator" 7 administrator
2.2 逻辑测试语句;
&&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。
||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。
!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确。
2.3 整数值比较语句;
可用的整数比较运算符
| 操作符 | 作用 |
| -eq | 是否等于 |
| -ne | 是否不等于 |
| -gt | 是否大于 |
| -lt | 是否小于 |
| -le | 是否等于或小于 |
| -ge | 是否大于或等于 |
2.4 字符串比较语句。
常见的字符串比较运算符
| 操作符 | 作用 |
| = | 比较字符串内容是否相同 |
| != | 比较字符串内容是否不同 |
| -z | 判断字符串内容是否为空 |
3. 流程控制语句
3.1 if 条件测试语句
3.1.1 单分支语句

1 使用单分支的if条件语句来判断/media/cdrom目录是否存在, 2 若不存在就创建这个目录, 3 反之则结束条件判断和整个Shell脚本的执行 4 5 [root@linuxprobe ~]# vim mkcdrom.sh 6 #!/bin/bash 7 DIR="/media/cdrom" 8 if [ ! -d $DIR ] 9 then 10 mkdir -p $DIR 11 fi
3.1.2 双分支语句

1 下面使用双分支的if条件语句来验证某台主机是否在线, 2 然后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息。 3 这里的脚本主要使用ping命令来测试与对方主机的网络连通性, 4 而Linux系统中的ping命令不像Windows一样尝试4次就结束, 5 因此为了避免用户等待时间过长,需要通过-c参数来规定尝试的次数, 6 并使用-i参数定义每个数据包的发送间隔, 7 以及使用-W参数定义等待超时时间。 8 9 [root@linuxprobe ~]# vim chkhost.sh 10 #!/bin/bash 11 ping -c 3 -i 0.2 -W 3 $1 &> /dev/null 12 if [ $? -eq 0 ] 13 then 14 echo "Host $1 is On-line." 15 else 16 echo "Host $1 is Off-line." 17 fi
3.1.3 多分支语句

1 在下面的脚本示例中,只有当用户输入的分数大于等于85分且小于等于100分时,才输出Excellent字样;若分数不满足该条件(即匹配不成功), 2 则继续判断分数是否大于等于70分且小于等于84分, 3 如果是,则输出Pass字样;若两次都落空(即两次的匹配操作都失败了), 4 则输出Fail字样: 5 6 [root@linuxprobe ~]# vim chkscore.sh 7 #!/bin/bash 8 read -p "Enter your score(0-100):" GRADE 9 if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then 10 echo "$GRADE is Excellent" 11 elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then 12 echo "$GRADE is Pass" 13 else 14 echo "$GRADE is Fail" 15 fi
3.2 for条件循环语句

1 [root@linuxprobe ~]# vim users.txt 2 andy 3 barry 4 carl 5 duke 6 eric 7 george 8 9 [root@linuxprobe ~]# vim addusers.sh 10 #!/bin/bash 11 read -p "Enter The Users Password : " PASSWD 12 for UNAME in `cat users.txt` 13 do 14 id $UNAME &> /dev/null 15 if [ $? -eq 0 ] 16 then 17 echo "$UNAME , Already exists" 18 else 19 useradd $UNAME 20 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null 21 echo "$UNAME , Create success" 22 fi 23 done
/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
1 [root@linuxprobe ~]# vim CheckHosts.sh 2 #!/bin/bash 3 HLIST=$(cat ~/ipaddrs.txt) 4 for IP in $HLIST 5 do 6 ping -c 3 -i 0.2 -W 3 $IP &> /dev/null 7 if [ $? -eq 0 ] 8 then 9 echo "Host $IP is On-line." 10 else 11 echo "Host $IP is Off-line." 12 fi 13 done
3.3 while条件循环语句

1 [root@linuxprobe ~]# vim Guess.sh 2 #!/bin/bash 3 PRICE=$(expr $RANDOM % 1000) 4 TIMES=0 5 echo "商品实际价格为0-999之间,猜猜看是多少?" 6 while true 7 do 8 read -p "请输入您猜测的价格数目:" INT 9 let TIMES++ 10 if [ $INT -eq $PRICE ] ; then 11 echo "恭喜您答对了,实际价格是 $PRICE" 12 echo "您总共猜测了 $TIMES 次" 13 exit 14 elif [ $INT -gt $PRICE ] ; then 15 echo "太高了!" 16 else 17 echo "太低了!" 18 fi 19 done
3.4 case条件测试语句
1 [root@linuxprobe ~]# vim Checkkeys.sh 2 #!/bin/bash 3 read -p "请输入一个字符,并按Enter键确认:" KEY 4 case "$KEY" in 5 [a-z]|[A-Z]) 6 echo "您输入的是 字母。" 7 ;; 8 [0-9]) 9 echo "您输入的是 数字。" 10 ;; 11 *) 12 echo "您输入的是 空格、功能键或其他控制字符。" 13 esac 14 [root@linuxprobe ~]# bash Checkkeys.sh 15 请输入一个字符,并按Enter键确认:6 16 您输入的是 数字。 17 [root@linuxprobe ~]# bash Checkkeys.sh 18 请输入一个字符,并按Enter键确认:p 19 您输入的是 字母。 20 [root@linuxprobe ~]# bash Checkkeys.sh 21 请输入一个字符,并按Enter键确认:^[[15~ 22 您输入的是 空格、功能键或其他控制字符。
4. 计划任务服务程序
4.1 一次性计划任务
at命令的参数及其作用
| 参数 | 作用 |
| -f | 指定包含命令的任务文件 |
| -q | 指定新任务名称 |
| -l | 显示待执行任务列表 |
| -d | 删除指定待执行任务 |
| -m | 任务执行后给用户发邮件 |
1 在使用at命令来设置一次性计划任务时,默认采用的是交互式方法。 2 例如,使用下述命令将系统设置为在今晚23:30自动重启网站服务 3 4 [root@linuxprobe ~]# at 23:30 5 warning: commands will be executed using /bin/sh 6 at> systemctl restart httpd 7 at> 此处请同时按下<Ctrl>+<d>键来结束编写计划任务 8 job 1 at Wed Oct 14 23:30:00 2020 9 [root@linuxprobe ~]# at -l 10 1 Wed Oct 14 23:30:00 2020 a root
4.2 长期性计划任务
crontab命令的参数及其作用
| 参数 | 作用 |
| -e | 编辑计划任务 |
| -u | 指定用户名称 |
| -l | 列出任务列表 |
| -r | 删除计划任务 |
这是使用crond服务设置任务的参数格式(其格式见表4-8)。需要注意的是,如果有些字段没有被设置,则需要使用星号(*)占位

使用crond设置任务的参数字段说明
| 字段 | 说明 |
| 分钟 | 取值为0~59的整数 |
| 小时 | 取值为0~23的任意整数 |
| 日期 | 取值为1~31的任意整数 |
| 月份 | 取值为1~12的任意整数 |
| 星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
| 命令 | 要执行的命令或程序脚本 |
1 使用crontab -e命令来创建计划任务,为自己创建计划任务时无须使用-u参数。 2 crontab –e命令的具体实现效果和crontab -l命令的结果如下所示: 3 4 [root@linuxprobe ~]# crontab -e 5 no crontab for root - using an empty one 6 crontab: installing new crontab 7 [root@linuxprobe ~]# crontab -l 8 25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

浙公网安备 33010602011771号