shell高级编程--循环判断

前言
※1.1 为什么要学习shell编程
Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够约定系统及各类软件附带的Shell脚本内容。只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础。
1.2 学好Shell编程所需的基础知识
学好Shell编程并通过Shell脚本轻松地实现自动化管理企业生产系统的必备基础如下:
(1)能够熟练使用vim编辑器,熟练SSH终端及”.vimrc”等的配置
(2)要有一定的Linux命令基础,至少需要掌握80个以上Linux常用命令,并能够熟练使用他们。
(3)要熟练掌握Linux正则表达式及三剑客命令(grep、sed、wak)
(4)熟悉常见的Linux网络服务部署、优化、日志分析及排除。

分支与循环

分支结构
1.1单分支结构

对于if来说,简单来说,其语义类似于汉语里的“如果…..那么”
第一种语法

if < 条件表达式 >

 then
   
 指令

fi

第二种语法

if < 条件表达式 > ;then

 指令

fi

条件表达式为真,执行指令,为假,不执行指令。

注:上文的“条件表达式”部分可以是test、[]、[[]]、(())、甚至可以把命令直接作为条件表达式,命令执行成功,条件表达式就true,就可以执行指令。

例1

if [ -d /etc/ ]

then

echo “/etc/ is a directory”

fi

输出结果为:/etc/ is a directory
[ -d /etc/ ] 是判断/etc/是否为目录,显然,根下的/etc/是目录,所以为真,执行echo “/etc/ is a directory “。

例2

if hostname > /dev/null ;then

 echo “it is successful”

fi

输出结果为:it is successful
在hostname &> /dev/null中hostname执行成功没问题,然后把执行结果重定向/dev/null,/dev/null相当于一个黑洞,写入里面的内容永远消失。我们只关心hostname这条命令是否执行成功,而不去管它的结果,因为结果都写入了黑洞,显然,hostname命令执行成功,条件判断为真,执行指令echo “it is successful”

1.2双分支结构

if条件语句的单分支结构主体就是“如果…..,那么……..”,而if条件语句的双分支结构主体则为“如果…….那么…….”.
if 条件语句的双分支结构语法为:

if <条件表达式>;then

 指令集1

else

 指令集2

fi

例3

num=10

if [[ $num -eq 10 ]];then
 
 echo “10”

else

 echo “not 10”
fi

说明:给变量num赋值10 , [[ $num -eq 10 ]] 判断变量的值是否等于10 , 等于10 , 执行echo “10” , 不等于10 , 执行 echo ” not 10 ” .

1.3多分支结构

if 条件语句多分支结构的主体为 “如果…… , 那么…….. , 否则如果……..,那么 , 那么 , 否则如果….. , 那么…… , 否则……” .
if条件语句多分支结构语法:

if <条件表达式1>;then

 指令1
elif <条件表达式2>;then

 指令2

elif <条件表达式3>;then
 
 指令3

else

 指令4

fi

是不是有晕呢 ? 下面举个很贴近生活的例子 , 比如你就相当一个女孩儿

如果 <你有房>

那么
 
 我就嫁给你

或者如果 <你爸有背景>

那么

 我也可以嫁给你

或者如果 <你很努力吃苦>

那么

 我们 可以先谈谈男女朋友

否则

 不理你

果如

例子4

if [[ -f $file ]];then

 echo “$file is ordinary file “

elif [[ -d $file ]]

 echo “$file is directory file “

elif [[ -L $file ]]

 echo “$file is link file “

else

 echo “$file is other file “

fi

说明:第一个判断是 , 如果变量file是普通文件就执行echo “$file is ordinary file ” , 如果变量file是目录文件就执行echo “$file is directory file ” , 如果变量是链接文件就执行echo “\$file is link file ” , 否则就执行echo “\$file is other file ” .

for循环

for 循环语句和while循环语句类似 , 但是for循环语句主要是用于执行次数有限的循环 , 而不是用于守护进程及无线循环 . for循环语句常见的语法有两种 , 下面我们将一 一介绍 .
###

第一种 for 循环语句的结构如下:

for 变量名 in 变量取值列表 ; do

指令

done

for 后面有个”变量名” , 变量名依次获取in关键字后面的变量取值列表内容 , 每次仅取一个 , 然后仅取一个 , 然后进入循环 do 和 done 之间的部分 , 执行循环内的所有指令 , 当执行单done时结束本次循环 . 之后 , “变量名” 再继续获取变量列表里的下一个变量值 , 继续执行循环内的所有指令 , 当执行到done时结束返回 . 以此类推 , 直到取完变量列表里的最后一个值并进入循环执行到done结束为止 .

例5

计算从1加100的整数

#/bin/bash

sum=0

for i in {1..100}; do

 let sum+=i

done

echo sum=$sum

脚本输出结果:5050
说明:变量 i 依次从1到100里面取数 , 取一次就进去循环 , sun 变量的值就加一次变量 i 取的值 , 加完之后结束一次循环 , 紧接着i 取下一个值 , 直到取到变量列表里面的最后一个值100 , 加完循环结束 . 跳出for 循环 , 执行 echo sum= $sum , 输出就为5050 . 同学们可以用数学算法验证下 , 这种计算方法出来的是否正确 , 如果数学计算这里不再赘述 .

第二种for循环语句称为C语言型语句 , 其语法结构如下:

for 关键字后的双口号内是三个表达式 , 第一个是变量初始化(例如:i=1) , 第二个为变量的范围(例如: i<100 ) , 第三个为变量自增自减(例如: i++) . 当第一个表达式的初始化值符合第二个变量的范围时 , 就进入循环执行 ; 当条件不满足就退出循环 .

for (( expr1; exp2; exp3 ))

do

 指令

done

例6

for (( i=1 ; i<10 ; i++ ))

do

 echo $i

done

输出:1 2 3 4 5 6 7 8 9
说明: 变量i 初始化的值为1 , 变量的范围时1到10 , 并且小于10 , 自增 , 输出1到9的整数 .

while循环和until循环

循环语句命令常用于重复执行一条指令或一组指令 , 直到条件不再满足时停止 , Shell脚本语言的循环语句常见的有 while util for 及 select 循环语句 .
while 循环语句主要用来重复执行一组命令或语句 , 在企业实际应用中 , 常用于守护进程或持续运行的程序 , 除此以外 , 大多数循环都会用到上文讲解的for循环语句 .

while 循环语句的基本语法:

while <条件表达式>

do

 指令…..

done

上文多次解释条件表达式和指令 , 这里和上文的用法类似 , 下面举例来理解while 循环语句 .

例7

同样我们用while实现求1加到100的和

sum=0

while [[ i -le 100 ]];do

 let sum+=i

 let i++

done

echo sum=$sum

说明:条件表达式里面规定 , 当i 小于等于100 时 , 执行let sum+=i 和 let i ++ ;当i 大于100 时 , 退出将不再执行指令 , 退出循环 . let sum+=i 表示 , sum = sum + i 每循环一次 , 执行一次 , let i++ 表示 每次i自增加1 . 循环结束 , 执行echo sum=$sum 命令 , 标准输出 变量sum的值 .

case条件语句

case条件语句相当于多分支的if/elif/else条件语句 , 但是它比这些条件语句看起来

更规范更工整 , 常被应用与实现系统服务启动脚本等企业应用场景中 .

在case 语句中 ,程序会将case获取的变量的值与表达式部分的值1 值2 值3 等逐个

进行比较 , 如果获取的变量值和某个值相匹配 , 就会执行值后面对应的指令 , 直到执

行到双分号 ;; 才停止 , 然后再跳出case语句主体 , 执行case语句后面的其他命令 .

case 条件语句的语法:

case “变量” in

值1)

 指令……

2)

 指令…

*)

 指令…..

esac

例8

#!/bin/bash

read -p “Please choose yes or no :” choose

case $choose in

[Yy]|[Yy][Ee][Ss])

 echo “your choose is yes “

[Nn]|[Nn][Oo])

 echo “your choose is no “

*)

 echo “please input yes or no “

case

说明:read -p “Please choose yes or no :” choose 提示用户输入一个值 , 并赋值变量shoose .

reak continue exit 的区别和对比

break continue 在条件语句及循环语句( for while if ) 中用于控制程序的走向 ; 而exit 则用于终止所有语句并退出当前 , 除此之外 , exit 还可以返回上一次程序或命令的执行状态值给当前shell ; return类似于exit , 只不过return 仅用于在函数内部返回函数执行的状态值 . 关于这几个命令的基本说明如下表:
条件与循环控制及程序返回值命令知识

命令说明
break n如果省略n,则跳出整个循环,n表示跳出循环的层数
continue n如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环.n表示退到第n层继续循环
exit n退出当前shell城西,n为上一次程序执行的状态返回值.n也可以省略,在下一个shell里可通过”$?”接受exit的n值
return n用于在函数里作为函数的返回值,以判断函数执行是否正确.在下一个shell里可通过”$?”接受exit的n的值
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值