shell脚步基本语法
1. 接受用户的参数
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CO0gTN1UjZ2UGNjdTYwQ2NxYzX2UzMwcTMwMzLcBTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
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
if条件语句来判断目录是否存在
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
if条件语句来验证某台主机是否在线,
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
if条件语句来判断分数
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条件测试语句
shell脚本入门
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命令的参数及其作用
参数 | |
指定包含命令的任务文件 | |
-q | 指定新任务名称 |
-l | 显示待执行任务列表 |
删除指定待执行任务 | |
-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
今晚23:30重启网站服务
4.2 长期性计划任务
crontab命令的参数及其作用
编辑计划任务 | |
-u | 指定用户名称 |
列出任务列表 | |
删除计划任务 |
这是使用crond服务设置任务的参数格式(其格式见表4-8)。需要注意的是,如果有些字段没有被设置,则需要使用星号(*)占位
字段 | 说明 |
分钟 | 取值为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
每周一、三、五的凌晨3:25,把某个网站的数据目录进行打包处理