if-then-else分支结构

if-then-else是一种基于条件测试结果的流程控制结构。如果测试结果为真,则执行控制结构中相应的命令列表;否则将进行另外一个条件测试或者退出该控制结构。

if-then-else语法格式:

if 条件1
then 命令列表1
elif 条件2
then 命令列表2
else 命令列表3
fi

执行逻辑流程图

说明:当条件1成立时,则执行命令列表1并退出if-then-else控制结构;如果条件2成立,则执行命令列表2并退出if-then-else控制结构;否则执行命令列表3并退出if-then-else控制结构。在同一个if-then-else结构中只能有一条if语句和一条else语句,eilf语句可以有多条。其中if语句是必须的,elif和else语句是可选的。

Shell脚本首先判断文件test1是否可读,如果是,则输出 is readable !的提示信息;否则不进行任何动作。

[root@localhost ]# vi test.sh
filename=test1
if [ -r $filename ] //输出test1可读则输出信息
then
echo $filename' is readable !'
fi
[root@localhost ]# sh test.sh
test1 is readable !

Shell脚本会判断number变量是否等于100,如果是,则输出 The number is equal 100 !的提示;否则输出 The number is not equal 100 !。

[root@localhost ]# vi number.sh
number=
if [ $number -eq ] //如果number等于100则输出“The number is equal 100 !”提示
then
echo 'The number is equal 100 !'
else //否则输出“The number is not equal 100 !”提示
echo 'The number is not equal 100 !'
fi
[root@localhost ]# sh number.sh
The number is not equal !

Shell脚本首先判断number变量是否小于10,如果是则输出 The number < 10 !;否则,判断number变量是否大于等于10且小于20。如果是则输出 10 =< The number < 20 !;否则,判断 number变量是否大于等于20且小于30。如果是,则输出 20 =< The number < 30 !;否则,输出 30 <= The number !。

[root@localhost ]# vi number1.sh
number=
if [ $number -lt ] //如果number小于10
then
echo 'The number < 10 !'
elif [ $number -ge -a $number -lt ] //如果number大于等于10且小于20
then
echo '10 =< The number < 20 !'
elif [ $number -ge -a $number -lt ] //如果number大于等于20且小于30
then
echo '20 =< The number < 30 !'
else //除上述3种情况以外的其他情况
echo '30 <= The number !'
fi
[root@localhost ]# sh number1.sh
=< The number < !

case分支结构

if-then-else结构能够支持多路的分支(多个elif语句),但如果有多个分支,那么程序就会变得难以阅读。case结构提供了实现多路分支的一种更简洁的方法。

case语法格式:

case 值或变量 in
模式1)
命令列表1
;;
模式2)
命令列表2
;;
...
esac

case语句后是需要进行测试的值或者变量。Shell会顺序地把需要测试的值或变量与case结构中指定的模式逐一进行比较,当匹配成功时,则执行该模式相应的命令列表并退出case结构(每个命令列表以两个分号“;;”作为结束)。如果没有发现匹配的模式,则会在esac后退出case结构。

如下该脚本对number变量的值进行测试,与模式匹配的话,则输出相应的信息。

[root@localhost ]# vi case.sh
number=
case $number in
) echo 'The number is 33 !' //number 变量等于 33
;;
) echo 'The number is 44 !' //number 变量等于 44
;;
) echo 'The number is 55 !' //number 变量等于 55
;;
) echo 'The number is 66 !' //number 变量等于 66
;;
) echo 'The number is 77 !' //number 变量等于 77
;;
) echo 'The number is 88 !' //number 变量等于 88
;;
esac //结束 case 结构
[root@localhost ]# sh case.sh
The number is ! //命令的输出结果

for循环结构

for循环结构可以重复执行一个命令列表,基于for语句中所指定的值列表决定是继续循环还是跳出循环。for循环在执行命令列表前会先检查值列表中是否还有未被使用的值,如有的话,则把该值赋给for语句中指定的变量,然后执行循环结构中的命令列表。如此循环,直到值列表中的所有值都被使用。

for循环结构语法:

for 变量名 in 值列表
do
命令1
命令2
命令3
...
done
  • 以常量作为值列表

使用变量1、2、3、4、5、6作为值列表,for循环中只是简单的把值列表中的值进行输出。

[root@localhost ]# vi for1.sh
#!/bin/bash
for n in //循环读取 1-6
do
echo $n
done
由运行结果可以非常清楚的了解for循环的运行过程。
[root@localhost ]# sh for1.sh
  • 以变量作为值列表

值列表可以是一个环境变量。

[root@localhost ]# vi for2.sh
#!/bin/bash
values="1 2 3 4 5 6" //对 values 变量赋值
for n in $values //循环读取 values 变量中的值
do
echo $n
done
[root@localhost ]# sh for2.sh
  • 以命令运行结果作为值列表

Shell支持使用命令的运行结果作为for循环的值列表。在Shell中通过"`命令`"或者“$(命令)”来引用命令的运行结果。将会以ls命令的结果作为值列表。

[root@localhost ]# vi for3.sh
#!/bin/bash
for n in `ls` //循环读取 ls 命令的输出结果
do
echo $n //输出变量 n 的值
done
[root@localhost ]# sh for3.sh
case.sh
for1.sh
for2.sh
for3.sh
HelloWorld.sh
number1.sh
number.sh
test1
test2
test.sh

expr命令计算器

expr是一个命令行的计数器,用于加、减、乘、除运算。

[root@localhost ]# expr  +  -   //123 加 456 减 78 等于 501

[root@localhost ]# expr  \*        //9 乘以 8 等于 72

[root@localhost ]# expr  /       // 666 除以 8 等于 83

在循环结构中,expr 会被用作增量计算,初始值为10,每次使用expr增加加11/12。注意:这里使用expr命令时都使用的是反撇号,不是单引号。

[root@localhost ]# number=
[root@localhost ]# number=`expr $number + ` //对number变量的值加11
[root@localhost ]# echo $number [root@localhost ]# number=`expr $number + ` //对number变量的值加12
[root@localhost ]# echo $number

while循环结构

while结构会循环执行一系列的命令,并基于while语句中所指定的测试条件决定是继续循环还是跳出循环。如果条件为真,则while循环会执行结构中的一系列命令。命令执行完毕后,控制返回循环顶部,从头开始重新执行直到测试条件为假。

while循环结构的语法:

while 条件
do
命令1
命令2
...
done
  • 循环增量计算:是在while循环中使用增量计算,其运行结果如下。

[root@localhost ]# vi while1.sh
#!/bin/bash
count= //将 count 变量置 0
#当 count 变量小于5时继续循环
while [ $count -lt ]
do
#每循环一次,count 变量的值加1
count=`expr $count + `
echo $count
done
[root@localhost ]# sh while1.sh [root@localhost ]#
  • 循环从文件中读取内容

现有一文件,保存了学生的成绩信息,其中第一列是学生名,第二列是学生的成绩。

[root@localhost ]# vi students.log
jake
tom
lucy
sam

现在要对以上文件中的学生成绩进行统计,计算学生的数量以及学生的平均成绩。通过 while read 语句读取变量 STUDENT 和 SCORE 的内容,然后在 while 循环中通过 expr 命令计算学生总数和学生总成绩,最后计算平均值并输出。执行该脚本时需要把 students.log 文件的内容重定向到 while2.sh脚本中。

[root@localhost ]# vi while2.sh
#!/bin/bash
TOTAL= //将变量 TOTAL 置 0
COUNT= //将变量 COUNT 置 0
#循环读取数据
while read STUDENT SCORE
do
#计算总成绩
TOTAL=`expr $TOTAL + $SCORE`
#计算学生数
COUNT=`expr $COUNT + `
done
#计算平均成绩
AVG=`expr $TOTAL / $COUNT`
echo 'There are '$COUNT' students , the avg score is '$AVG
[root@localhost ]# sh while2.sh < students.log
There are students , the avg score is
[root@localhost ]#

until循环结构

until是除 for 和 while以外的一种循环结构,它会循环执行一系列命令直到条件为真时停止。

until循环结构语法:

until 条件
do
命令1
命令2
...
done

until循环中读取用户输入的内容并显示到屏幕上,当用户输入的内容为 exit 时结束循环。

[root@localhost ]# vi until1.sh
#!/bin/bash
xxx=""
#当 ans 变量的值为 exit 时结束循环
until [ "$xxx" = exit ]
do
#读取用户的输入到ans变量
read xxx
#如果用户输入的不是 exit 则输出用户的输入
if [ "$xxx" != exit ]
then
echo 'The user input is : '$xxx
#否则退出循环
else
echo 'Exit the script.'
fi
done
[root@localhost ]# sh until1.sh
hello
The user input is : hello
welcome to HongKong!
The user input is : welcome to HongKong!
exit
Exit the script.
[root@localhost ]#

Shell编程-控制结构 | 基础篇的更多相关文章

  1. Linux学习笔记(17) Shell编程之基础

    1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...

  2. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  3. (转)Android高性能编程(1)--基础篇

    关于专题     本专题将深入研究Android的高性能编程方面,其中涉及到的内容会有Android内存优化,算法优化,Android的界面优化,Android指令级优化,以及Android应用内存占 ...

  4. Shell编程入门基础上

    前言 为什么学 Shell Shell 脚本语言是实现 Linux/UNIX 系统管理及自动化运维所必备的重要工具, Linux/UNIX 系统的底层及基础应用软件的核心大都涉及 Shell 脚本的内 ...

  5. 【Java_多线程并发编程】基础篇——synchronized关键字

    1. synchronized同步锁的原理 当我们调用某对象的synchronized方法或代码块时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁 ...

  6. Win32编程API 基础篇 -- 1.入门指南 根据英文教程翻译

    入门指南 本教程是关于什么的 本教程的目的是向你介绍使用win32 API编写程序的基础知识(和通用的写法).使用的语言是C,但大多数C++编译器也能成功编译,事实上,教程中的绝大多数内容都适用于任何 ...

  7. .net 4.0 面向对象编程漫谈基础篇读书笔记

    话说笔者接触.net 已有些年头,做过的项目也有不少,有几百万的,也有几十万的,有C/S的,也有B/S的.感觉几年下来,用过的框架不少,但是.net的精髓一直没有掌握.就像学武之人懂得各种招式,但内功 ...

  8. 深入理解node.js异步编程:基础篇

    ###[本文是基础内容,大神请绕道,才疏学浅,难免纰漏,请各位轻喷] ##1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平 ...

  9. shell编程awk基础介绍

    awk介绍 报告生成器,格式化文本输出 处理机制类似sed命令,自带循环处理    读入一行处理一行然后自动读取下一行再进行处理 sed命令换行的标识是固定的,只能是回车换行.    awk里面的换行 ...

随机推荐

  1. [Reinforcement Learning] Policy Gradient Methods

    上一篇博文的内容整理了我们如何去近似价值函数或者是动作价值函数的方法: \[ V_{\theta}(s)\approx V^{\pi}(s) \\ Q_{\theta}(s)\approx Q^{\p ...

  2. 利用crontab定时提交svn遇到的几个问题

    交待下背景...公司开发组只有技术经理有服务器和数据库权限,还只是开发环境的..因为工作安排和权限限制,测试同学上线的时候,需要本人帮开发组的部分同事review代码并把代码提交到trunk.一开始手 ...

  3. count

    select deptno as 部门,count(*) as 人数from emp group by deptno;  --统计各个部门的人数

  4. 通过配置文件新建solr的core

    目录solr-7.5.0\server\solr 1.  新建文件夹 test-core 2. 在文件夹test-core下新建core.properties name=test-core confi ...

  5. 安卓触控一体机的逆袭之路_追逐品质_支持APP软件安卓

    显示性能参数 接口:RGB信号 分辨率:1024*600 比例16:9 显示尺寸(A.A.):222.72*(W)*125.28(H)mm 外围尺寸:235.0(W)*143.0(H)*4.5(T)m ...

  6. /usr/bin/ld: warning: libavformat.so.57, needed by /home/camera.so, not found (try using -rpath or -rpath-link)

    ffmpeg中,使用libavformt.so.57时,查找不到. 解决方案: 修改ld.so.conf文件,添加路径. sudo gedit /etc/ld.so.conf 在文件末尾添加路径 /u ...

  7. 从头开始学gradle【各系统安装gradle】

    所有的环境都是基于jdk1.8 java -version windows安装 下载对应的gradle.zip安装包,解压到指定文件即可,然后配置相应的环境变量即可使用 linux/mac 安装 mk ...

  8. docker容器和镜像的导入和导出

    镜像的保存 [root@wxtest1607 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat8 3.0 90457edaf6 ...

  9. a标签锚点平滑跳转

    一.创建锚点 <div class="header" id="top">//终点标签,添加一个id <a href="#top&qu ...

  10. GraphQL ---02 GraphQL和C#结合的实战项目

    本文章是介绍和记录如何创建GraphQL项目,以及如何使用GraphQL进行数据的相关操作.项目参照GraphQL .Net 的官方文档进行实践 一.项目结构: 为了更好的和原有的项目结合在一起,尽可 ...