Shell脚本-流程控制语句


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

一. if条件测试语句

1. if 单分支结构

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

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

2. if 双分支结构

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

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

[[email protected] ~]# 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

测试:

[[email protected] ~]# bash chkhost.sh 192.168.10.10
Host 192.168.10.10 is On-line.
[[email protected] ~]# bash chkhost.sh 192.168.10.20
Host 192.168.10.20 is Off-line.

3. if条件多分支

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

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

[[email protected] ~]# 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
[[email protected] ~]# bash chkscore.sh
Enter your score(0-100):88
88 is Excellent
[[email protected] ~]# bash chkscore.sh
Enter your score(0-100):80
80 is Pass

测试:

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

二、for条件循环语句

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

vim users.txt
andy
barry
carl
duke
eric
george

编写Example.sh脚本

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

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

三、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

在这里插入图片描述

四、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:结束当次循环,进行下一次循环

猜你喜欢

转载自blog.csdn.net/fanbaodan/article/details/88601759
0条评论
添加一条新回复