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

[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键确认:$
您输入的是 空格、功能键或其他控制字符
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容

  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,547评论 0 0
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,025评论 1 19
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,375评论 1 45
  • “工作还带情绪,你不滚蛋谁滚蛋?”大熊冷冷的说到。 “让你来上班不是让你来体验生活的,给你钱你干事,你别和我说你想...
    溪山君阅读 190评论 0 0
  • 鉴于身边同事一个心梗已故,两个检查出癌症,深刻认识到“身体健康才是1”。 那就从跑步开始吧! 接下来的60天,刻意...
    大风起兮云飞扬_780b阅读 297评论 0 0