[TOC]
流程控制语句
1 if条件测试语句
if语句分为三种结构:
- 单分支结构
- 双分支结构
- 多分支结构
1.1 单分支结构
if 条件测试操作(如:目录不存在)
then 命令序列(如:创建该目录)
fi
示例:使用单分支语句判断 /doc/sh_folder
文件是否存在,不存在则创建该目录,否则结束条件判断和脚本
[root@study doc]# vim mksh.sh
#! /bin/bash
# 如果目录 /doc/sh_folder 不存在,则创建该目录
DIR="/doc/sh_folder"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
验证:
[root@study doc]# bash mksh.sh
[root@study doc]# ls -d ./sh_folder
./sh_folder
1.2 双分支结构
if 条件测试操作(能够ping通)
then 命令序列1(提示服务器正常工作)
else 命令序列2(报警服务器出现问题)
fi
示例:
[root@study doc]# vim chkhost.sh
#! /bin/bash
# ping命令验证某台主机是否在线
# 参数 -c :规定尝试次数
# 参数 -i :定义每个数据包的发送间隔
# 参数 -W :定义等待超时时间
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
验证:
[root@study doc]# bash chkhost.sh www.baidu.com
Host www.baidu.com is On-line
[root@study doc]# bash chkhost.sh www.baidu.ccc
Host www.baidu.ccc is Off-line
1.3 多分支结构
if 条件测试操作1(分数85~100之间)
then 命令序列1(判为优秀)
elif 条件测试操作2(分数70~84之间)
then 命令序列2(判为合格)
else
命令序列3(判为不合格)
fi
示例:
[root@study doc]# vim chkscore.sh
#! /bin/bash
# 命令 read:用来读取用户输入信息的命令,能够把接受到的用户输入信息赋值给后面的指定变量
# 参数 -p:用于向用户显示一定的提示信息
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@study doc]# bash chkscore.sh
Enter your score(0-100):88
88 is Excellent
[root@study doc]# bash chkscore.sh
Enter your score(0-100):78
78 is Pass
2 for条件循环语句
for 变量名(用户名) in 取值列表(列表文件)
do
命令序列(创建用户并设置密码)
done
/dev/null
是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱)
示例1:
#! /bin/bash
# for循环的例子
read -p "Enter The Users Password: " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Alread 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
验证1:
[root@study sh_folder]# bash exampleOfFor.sh
Enter The Users Password: cc123456
c1,Create success
c2,Create success
c3,Create success
c4,Create success
c5,Create success
[root@study sh_folder]# tail -n -5 /etc/passwd
c1:x:1001:1001::/home/c1:/bin/bash
c2:x:1002:1002::/home/c2:/bin/bash
c3:x:1003:1003::/home/c3:/bin/bash
c4:x:1004:1004::/home/c4:/bin/bash
c5:x:1005:1005::/home/c5:/bin/bash
示例2:
#! /bin/bash
# 批量检查主机是否在线
HLIST=$(cat ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $IP is On-line"
else
echo "Host $IP is off-line"
fi
done
验证2:
[root@study sh_folder]# bash CheckHost.sh
Host www.baidu.com is On-line
Host www.baidu.ccc is off-line
Host 202.105.136.82 is On-line
3 while条件循环语句
while 条件测试操作(未猜中正确价格)
do
命令序列(反复猜测商品价格)
done
示例:
$RANDOM
变量的随机数值范围为 0~32767
[root@study sh_folder]# 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 "您总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了"
else
echo "太低了"
fi
done
验证:
[root@study sh_folder]# bash Guess.sh
商品实际价格为 0~999,猜猜看是多少?
请输入您猜测的价格:555
太高了
请输入您猜测的价格:100
太低了
请输入您猜测的价格:333
太高了
请输入您猜测的价格:2222^H^H
Guess.sh: line 9: [: 22: integer expression expected
Guess.sh: line 13: [: 22: integer expression expected
太低了
请输入您猜测的价格:222
太高了
请输入您猜测的价格:155
太高了
请输入您猜测的价格:125
太低了
请输入您猜测的价格:135
太低了
请输入您猜测的价格:140
太低了
请输入您猜测的价格:150
太低了
请输入您猜测的价格:152
恭喜您答对了,实际价格是:152
您总共猜测了 11 次
4 case条件测试语句
case 变量值 输入的字符 in
模式1) [a-z] | [A-Z])
命令序列1 提示为字母
;;
模式2) [0-9])
命令序列2 提示为数字
;;
*)
默认命令序列 提示为特殊字符
esac
示例:
[root@study sh_folder]# vim Checkkeys.sh
#! /bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "您输入的是 字母"
;;
[0-9])
echo "您输入的是 数字"
;;
*)
echo "您输入的是 空格、功能键或其他控制字符"
esac
验证:
[root@study sh_folder]# bash Checkkeys.sh
请输入一个字符,并按Enter键确认:6
您输入的是 数字
[root@study sh_folder]# bash Checkkeys.sh
请输入一个字符,并按Enter键确认:c
您输入的是 字母
[root@study sh_folder]# bash Checkkeys.sh
请输入一个字符,并按Enter键确认:$
您输入的是 空格、功能键或其他控制字符
网友评论