美文网首页
编写Shell脚本---流程控制语句

编写Shell脚本---流程控制语句

作者: CC晨_程序小生 | 来源:发表于2018-12-18 16:50 被阅读0次

[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键确认:$
您输入的是 空格、功能键或其他控制字符

相关文章

网友评论

      本文标题:编写Shell脚本---流程控制语句

      本文链接:https://www.haomeiwen.com/subject/ydmlkqtx.html