shell 流程控制语句的具体使用
前言
可以说,在任何一门编程语言中都离不开流程控制语句,使用流程控制语句可以帮助程序处理各类复杂的操作,常用的流程控制语句,比如: if-else,while,for循环等,在linux 的shell 编程语法中,也提供了丰富的流程控制语句,接下来将一一做详细的说明。
一、if - else 语句
if 语法
if 条件 then 命令 fi
if - else 语法
if 条件 then 命令 else 命令 fi
if elif else 语法
if 条件1 then 命令1 elif 条件2 then 命令2 elif 条件3 then 命令3 …… else 命令N fi
接下来用一个简单的案例完整演示下这几种if 语法的使用
案例需求描述
提示"请输入考试成绩:" 接收用户输入的一个成绩, 之后使用if else条件句判断
要求1: 小于 60 输出"不及格"
要求2: 大于等于70 并且 小于80 输出"中等"
要求3: 大于等于80 并且 小于90 输出"良好"
要求4: 大于等于90 并且 小于等于100 输出"优秀"
要求5: 以上不符合输出"成绩不合法"
shell 脚本内容
#!/bin/bash read -p "请输入考试成绩:" score if (( $score < 60 )); then echo "不及格" elif (( $score >= 60 && $score < 70 )); then echo "及格" elif (( $score >= 70 && $score < 80 )); then echo "中等" elif (( $score >= 80 && $score < 90 )); then echo "良好" elif (( $score >= 90 && $score <= 100 )); then echo "优秀" else echo "成绩不合法" fi
执行上面的shell ,观察输出效果
补充说明
(())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( $a == $b ))
判断条件成立,进入 if,执行 then 后边的 echo 语句
二、case语句
shell 中case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令,当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。
case 语法结构
case 值 in 匹配模式1) 命令1 命令2 ... ;; 匹配模式2) 命令1 命令2 ... ;; *) 命令1 命令2 ... ;; esac
关于case 语法的几点补充说明
- 每一匹配模式必须以右括号结束;
- 取值可以为变量或常数;
- 匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;(类似break, 不可以替代否则语法报错);
- 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令;
- case、in 和 esac 都是 Shell 关键字, esac就是case的反写在这里代表结束case;
- 匹配模式: 可以是一个数字、一个字符串,甚至是一个简单正则表达式;
简单正则表达式支持如下通配符
格式 | 说明 |
---|---|
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。 |
[m-n] | 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。 |
| | 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
case 语句案例演示
#!/bin/bash read -p "请输入一个0~7的数字:" number case $number in 1) echo "星期一" ;; 2) echo "星期二" ;; 3) echo "星期三" ;; 4) echo "星期四" ;; 5) echo "星期五" ;; 6) echo "星期六" ;; 0|7) echo "星期日" ;; *) echo "您输入的数字无效" ;; esac
执行上面的shell脚本,观察输出效果
三、while 语句
while 语法
while 条件 do 命令1 命令2 ... continue; # 结束当前这一次循环, 进入下一次循环 break; # 结束当前循环 done
一个简单的案例
#!/bin/bash read -p "请输入一个数字:" number i=0 while [[ $i < $number ]] do echo "hello world :" $i ((i++)) done
执行上面的shell 脚本,观察输出效果
使用while语句可以实现无限循环,写法如下
while : do command done
或者下面这样
while true do command done
四、until语句
until 也属于循环结构语句, until 循环与 while 循环在处理方式上刚好相反, 循环条件为false会一致循环, 条件为true停止循环。
until 语法
条件如果返回值为1(代表false),则继续执行循环体内的语句,否则跳出循环。
until 条件 do 命令 done
案例演示
#!/bin/bash read -p "请输入一个数字:" number i=0 until [[ ! $i < $number ]] do echo "hello world : " $i ((i++)) done
执行上面的shell脚本,观察输出效果
五、for语句
for 语法写法一
for var in item1 item2 ... itemN do 命令1 命令2 ... done
1、var是循环变量
2、item1 item2 ... itemN 是循环的范围
演示案例
#!/bin/bash for i in 1 2 3 4 5 do echo "hello world :" $i done
执行上面的脚本,观察输出效果
for 语法写法二
语法结构
for var in {start..end} do 命令 done
start: 循环范围的起始值,必须为整数
end: 循环范围的结束值, 必须为整数
案例演示
#! /bin/bash for i in {1..5}; do echo $i; done
运行这段脚本,观察输出效果
for 语法写法三
语法结构
这种写法相信做过应用端编程开发的同学更熟悉点吧
for((i=start;i<=end;i++)) do 命令 done
也可以简写成一行
for((i=start;i<=end;i++)); do 命令; done
案例演示
#! /bin/bash for((i=0;i<=3;i++)); do echo "hello word : " $i; done
运行上面的sql,观察执行效果
无限for循环
在某些特殊的场景下,需要程序无限循环下去,可以参考下面的写法
for((;;)); do 命令; done
六、select 语句
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功。select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景, 其他语言没有。
select 语法
select var in menu1 menu2 ... do 命令 done
注意:
1、select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环;
2、执行命令过程中: 终端会输出
#?
代表可以输入选择的菜单编号;
案例演示1
#!/bin/bash echo "你的爱好是什么?" select hobby in "编程" "游戏" "篮球" "游泳" do echo $hobby break done echo "你的爱好是:${hobby}"
运行上面的shell观察执行效果
案例演示2
#!/bin/bash echo "你的爱好是什么" select hobby in "编程" "游戏" "篮球" "游泳" do case $hobby in "编程") echo "编程,多敲代码" break ;; "游戏") echo "少玩游戏" break ;; "篮球"|"游泳") echo "运动有利健康" break ;; *) echo "输入错误,请重新输入" esac done
运行上面的shell,观察执行效果
接下来,补充几个比较重要的关于shell操作中的知识点
八、文件测试 test
在使用shell编程过程中,经常涉及到对各类文件,文件目录的操作,比如判断文件目录是否存在,文件里面的内容是否存在等,就需要用到文件测试相关的命令,下面总结的是和文件测试操作相关的语法。
参数 | 说明 |
---|---|
==-e 文件名== | exists, 如果文件存在则为真 |
==-r 文件名== | read,如果文件存在且可读则为真 |
==-w 文件名== | write,如果文件存在且可写则为真 |
==-x 文件名== | execute,如果文件存在且可执行则为真 |
==-s 文件名== | string,如果文件存在且至少有一个字符则为真 |
==-d 文件名== | directory,如果文件存在且为目录则为真 |
-f 文件名 | file,如果文件存在且为普通文件则为真 |
-c 文件名 | character,如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
案例演示
#!/bin/bash if test -w ./if.sh then echo '文件已存在并且可写!' else echo '文件不存在或不可写!' fi if test -e ./if.sh -a -e ./control2.sh then echo '两个文件都存在!' else echo '可能有一个或两个文件不存在' fi
运行上面的shell脚本,观察输出效果
补充说明
Shell提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低, 语法,如下:
test 条件1 -o 条件2 -a 条件3 ...
九、整数和字符串比较 test
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
功能与[]一样。
整数比较测试
if test 数字1 options 数字2 then ... fi
options具体如下
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
整数比较具体案例
#!/bin/bash num1=1 num2=1 num3=2 echo "num1=${num1},num2=${num2},num3=${num3}" if test $num1 -eq $num2 then echo 'num1和num2两个数相等!' else echo 'num1和num2两个数不相等!' fi if test $num2 -eq $num3 then echo 'num2和num3两个数相等!' else echo 'num2和num3两个数不相等!' fi
运行上面的shell,观察执行效果
字符串比较测试
语法结构
参数 | 说明 |
---|---|
= 或 == | 等于, 等于返回0代表成功,否则返回1代表失败 |
!= | 不等于 |
\< | 小于 |
\> | 大于 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
字符串比较具体案例
#!/bin/bash str1="itheima" str2="itcast" str3="" echo "str1=${str1},str2=${str2},str3=${str3}" if test $str1 = $str2 then echo 'str1和str2两个字符串相等' else echo 'str1和str2两个字符串不相等' fi if test $str1 \> $str2 then echo 'str1大于str2' else echo 'str1小于str2' fi if test -z $str2 then echo "str2字符串长度为0" else echo "str2字符串长度不为0" fi if test -z $str3 then echo "str3字符串长度为0" else echo "str3字符串长度不为0" fi
执行上面的shell,观察输出效果
到此这篇关于shell 流程控制语句的具体使用的文章就介绍到这了,更多相关shell 流程控制语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决linux下openoffice word文件转PDF中文乱码的问题
下面小编就为大家带来一篇解决linux下openoffice word文件转PDF中文乱码的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-11-11linux下安装oracle后使用命令行启动的方法 linux启动oracle
这篇文章主要介绍了在linux下安装oracle后使用命令启动oracle的方法,大家参考使用吧2014-01-01
最新评论