Shell编程控制结构的基本使用

目录
  • if-then-else分支结构
  • case分支结构
  • for循环结构
    • 以常量作为值列表
    • 以变量作为值列表
    • 以命令运行结果作为值列表
  • expr命令计算器
  • while循环结构
  • until循环结构

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

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

[root@localhost 20190105]# vi number.sh
number=200
if [ $number -eq 100 ]                 //如果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 20190105]# sh number.sh
The number is not equal 100 !

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

case分支结构

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

case语法格式:

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

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

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

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

for循环结构

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

for循环结构语法:

for 变量名 in 值列表
do
 命令1
 命令2
 命令3
 ...
done

以常量作为值列表

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

[root@localhost 20190105]# vi for1.sh
#!/bin/bash
for n in 1 2 3 4 5 6      //循环读取 1-6
do
       echo $n
done
由运行结果可以非常清楚的了解for循环的运行过程。
[root@localhost 20190105]# sh for1.sh
1
2
3
4
5
6

以变量作为值列表

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

[root@localhost 20190105]# vi for2.sh
#!/bin/bash
values="1 2 3 4 5 6"         //对 values 变量赋值
for n in $values            //循环读取 values 变量中的值
do
       echo $n
done
[root@localhost 20190105]# sh for2.sh
1
2
3
4
5
6

以命令运行结果作为值列表

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

[root@localhost 20190105]# vi for3.sh
#!/bin/bash
for n in `ls`         //循环读取 ls 命令的输出结果
do
       echo $n      //输出变量 n 的值
done
[root@localhost 20190105]# 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 20190105]# expr 123 + 456 - 78  //123 加 456 减 78 等于 501
501
[root@localhost 20190105]# expr 9 \* 8       //9 乘以 8 等于 72
72
[root@localhost 20190105]# expr 666 / 8      // 666 除以 8 等于 83
83

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

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

while循环结构

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

while循环结构的语法:

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

循环增量计算:是在while循环中使用增量计算,其运行结果如下。

[root@localhost 20190105]# vi while1.sh
#!/bin/bash
count=0             //将 count 变量置 0
#当 count 变量小于5时继续循环
while [ $count -lt 5 ]
do
#每循环一次,count 变量的值加1
       count=`expr $count + 1`
       echo $count
done
[root@localhost 20190105]# sh while1.sh
1
2
3
4
5
[root@localhost 20190105]#

循环从文件中读取内容

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

[root@localhost 20190105]# vi students.log
jake 85
tom  68
lucy 79
sam  95

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

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

until循环结构

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

until循环结构语法:

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

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

[root@localhost 20190105]# 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 20190105]# 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 20190105]#

到此这篇关于Shell编程控制结构的基本使用的文章就介绍到这了,更多相关Shell 控制结构内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈shell脚本中的控制流结构

    习惯了c/c++的编程环境,再转到shell编程上,总有那么一点陌生的感觉. shell中一般的if-then-else函数格式无外乎如下: if 条件1 then 命令1 elif 条件2 then命令2 else 命令3 fi 而linux中 若命令退出状态为0,则退出成功,无错误: 若退出状态为1,则退出失败,某处有错误. if-then-else-函数中,条件1为条件测试,若条件1返回为0,表示测试为真,执行命令1:反之,返回1,则执行elif. 亦即以条件是否测试成功为if的判断标准,

  • Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误. if 语句通过关系运算符判断表达式的真假来决定执行哪个分支.Shell 有三种 if ... else 语句: if ... fi 语句 if ... else ... fi 语句 if ... elif ... else ... f

  • 浅谈Shell 流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); } else { // 不做任何事情 } 在sh/bash里可不能这么写,如果else分支没有语句执行,就不要写这个else. if else if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符):

  • linux shell命令执行顺序的控制方法

    &&命令1 && 命令2:如果这个命令执行成功&&那么执行这个命令.[jb]/usr/xxxx/ytcclb>ls -l test.sql-rwxr--r-- 1 xxxx group 225 Nov 15 14:12 test.sql[jb]/usr/xxxx/ytcclb>cp test.sql test.bak && echo "coping file ok!"coping file ok![jb]/us

  • Shell编程控制结构的基本使用

    目录 if-then-else分支结构 case分支结构 for循环结构 以常量作为值列表 以变量作为值列表 以命令运行结果作为值列表 expr命令计算器 while循环结构 until循环结构 if-then-else分支结构 if-then-else是一种基于条件测试结果的流程控制结构.如果测试结果为真,则执行控制结构中相应的命令列表:否则将进行另外一个条件测试或者退出该控制结构. if-then-else语法格式: if 条件1 then 命令列表1 elif 条件2 then 命令列表2

  • Linux下Shell编程快捷键大全(日常整理)

    有时候,我们需要在 Bash 中重复执行先前的命令.你当然可以使用上方向键来查看之前曾经运行过的命令.但这里有一些更好的方式,例如,数量掌握以下的快捷键. 1) !!:重复执行上一条指令 2) !a:重复执行上一条以a为首的指令 3) !number:重复执行上一条在history表中记录号码为number的指令 4) !-number:重复执行前第number条指令 5) !$:表示获得上一条命令中的最后一项内容 6) 用Ctrl + r 组合键来进入历史搜索模式在history表中查询某条过

  • shell编程基础知识小结

    1.文件类型介绍linux系统中主要包括以下七种文件类型: d 目录 - 普通文件 l 符号链接 s 套接字文件 b 块设备文件 c 字符设备文件 p 命名管道文件 2.正则表达式正则表达式在shell编程中非常重要. 从一个文件或命令输出中抽取或过滤文本时.可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合. 基本的元字符集:^ 只匹配行首.$ 只匹配行尾.* 一个单字符后紧跟*,匹配0个或多个此单字符.[] 匹配[]内字符,可以是一个单字符,也可以是字符序列.可以使用

  • Shell编程的一些知识集合

    下午在写程序的时候需要将shell命令返回的数值赋予给某变量,使用了a=$()的方法 soft=$(grep -i "\(Software \)Token/Passcode/." 123.txt |wc -l) echo "[+] 软卡总数:" $soft ...... #!shell下的运算 over=$((var-use)) echo "[+] 剩余硬卡:" $over Shell的嵌入命令 : 空,永远返回为true . 从当前shell中

  • Shell编程中while与for的区别及用法详解

    在shell编程中经常用到循环,常用的循环有for和while循环两种.while循环默认以行读取文件,而for循环以空格读取文件切分文件,本篇就结合现网的一些使用示例说说二者的用法和区别. 一.常用语法 1.for循环 for循环常用的语法结构有如下几种: for 变量 in seq字符串 for 变量 in `command` " " for 变量 in "$@"或"$*" for((赋值:条件:运算语句)) 2.while循环 while循

  • 深入浅出Shell编程 Shell变量介绍

    •深入浅出Shell编程: Shell 变量 ◦1 系统变量 ◦2 Shell用户变量 ■2.1 基础 ■2.2 使用技巧 ■2.3 shell 中的数组 ◦3 shell 环境变量 先不要管Shell的版本,来看看Shell 变量,在Shell中有三种变量:系统变量,环境变量,用户变量.其中用户变量在编程过程中使用最多,系统变量在对参数判断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置. 1 系统变量 Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候.

  • shift妙用之解决shell编程中的入参问题

    我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本.程序员是有基因,对编程语言是有偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦的摸索和学习,但是,我愿意:学习shell/python,我也很乐意,甚至Lisp这种冷门的语言我也充满了好奇,虽然现在Go和Erlang我一点也不懂,但是我按耐不住对这两种语言的兴趣,只要我抽出手来,一定会和他们缠绵一番.有爱就会有恨,我痛苦地意识到到自己是个很情绪化的程序员,哪怕我一遍遍地骂自己

  • Shell编程之特殊变量的笔记小结

    $0 $# $n-->$[1..9] $* $@ 1.在shell中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量 $0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出 $n:获取当前执行的shell脚本的第n个参数值比如:[n=1..9],如果N大于9那么就要使用{}来定义 比如${10} $#:获取当前shell脚本后面接的参数的个数 $*:获取当前脚本的参数,不加引号和

  • 详解Shell编程之变量数值计算(二)

    OK,数值运算(上)是我看完的一小部分,大概的结束脚本如下:(回顾~~) #!/bin/bash a=$1 b=$2 expr $1 + 1 &>/dev/null if [ "$?" -ne "0" ] then echo "请输入数字" exit 1 fi if [ "$#" -ne "2" ] then echo "请输入两个数字" exit 1 fi echo &q

  • 详解Shell编程之变量数值计算(一)

    如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下: +.-.:代表着加号 和减号 或者,负号 *./.%:代表着乘号,除号,和取模. **   : 幂运算 ++.-- :表示着增加或者减少,它可以放在前置,也可以放在变量的结尾 !.||.&&.(取反)(或) (and) <.<=.>.>=  :比较符号,小于.小于等于.大于.大于等于 ==.!=.= :相等,不相等, =表示相等于 <<     >> 

随机推荐