Shell脚本-流程控制语句


编写shell脚本一般少不了流程空语句,虽然简单,仍是梳理一下吧。

一. if条件测试语句

1. if 单分支结构

在这里插入图片描述
举例:
判断/media/cdrom 文件是否存在,若存在就结束条件判断和整个 Shell 脚本,反之则去建立这个目录:linux

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

2. if 双分支结构

在这里插入图片描述
举例:
使用双分支的 if 条件语句来验证某台主机是否在线,而后根据返回值的结果,要么显示主机在线信息,要么显示主机不在线信息。web

补充ping命令
ping 命令来测试与对方
主机的网络联通性,而 Linux 系统中的 ping 命令不像 Windows 同样尝试 4 次就结束,所以为了不用户等待时间过长,须要经过-c 参数来规定尝试的次数,并使用-i 参数定义每一个数据包的发送间隔,以及使用-W 参数定义等待超时时间。shell

[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

测试:vim

[root@linuxprobe ~]# bash chkhost.sh 192.168.10.10
Host 192.168.10.10 is On-line.
[root@linuxprobe ~]# bash chkhost.sh 192.168.10.20
Host 192.168.10.20 is Off-line.

3. if条件多分支

在这里插入图片描述
举例:
使用多分支的 if 条件语句来判断用户输入的分数在哪一个成绩区间内,而后输出如Excellent、Pass、Fail 等提示信息。bash

补充 read 命令
read 是用来读取用户输入信息的命令,可以把接收到的用户输入信息赋值给后面的指定变量,-p 参数用于向用户显示必定的提示信
息。网络

[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

测试:svg

[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):30
30 is Fail
[root@linuxprobe ~]# bash chkscore.sh
Enter your score(0-100):200
200 is Fail

2、for条件循环语句

for 循环语句容许脚本一次性读取多个信息,而后逐一对信息进行操做处理,当要处理的数据有范围时,使用for 循环语句再适合不过了。
在这里插入图片描述
举例: 批量建立用户
使用 for 循环语句从列表文件中读取多个用户名,而后为其逐一建立用户帐户并设置密码。首先建立用户名称的列表文件 users.txt,每一个用户名称单独一行测试

vim users.txt
andy
barry
carl
duke
eric
george

编写Example.sh脚本3d

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

执行完第一次 显示建立成功,再执行一下,显示已经存在,表示运行成功。
实际执行状况以下:
在这里插入图片描述code

3、while 条件循环语句

while 循环语句经过判断条件测试的真假来决定是否继续执行命令,若条件为真就继续执行,为假就结束循环。
在这里插入图片描述
举例: 猜大小
使用$RANDOM 变量来调取出一个随机的数值(范围为 0~32767),
将这个随机数对 1000 进行取余操做,并使用 expr 命令取得其结果,再用这个数值与用户经过 read命令输入的数值进行比较判断。

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 "您总共猜 g $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "过高了!"
else
echo "过低了!"
fi
done

在这里插入图片描述

4、case 条件测试语句

在这里插入图片描述

注意

  • 模式结束后 有一个 “ )” 表示结束。
  • 在匹配上模式之后,执行命令结束用“;;” 表示结束。
  • 最后一个命令结束的时候用 esac 表示结束。

示例: 判断输入字符类型

vim Checkkeys.sh
#!/bin/bash
read -p "请输入一个字符,并按 Enter 键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您输入的是 字母。"
;;
[0-9])
echo "您输入的是 数字。"
;;
*)
echo "您输入的是 空格、功能键或其余控制字符。"
esac

测试结果:
在这里插入图片描述

补充一些经常使用的关键字:

break与continue: 关键字 break:提早结束循环(即想跳出循环) 关键字continue:结束当次循环,进行下一次循环