前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux Shell基础篇六 - 流程控制

Linux Shell基础篇六 - 流程控制

作者头像
兜兜转转
发布2023-03-08 13:51:04
8630
发布2023-03-08 13:51:04
举报
文章被收录于专栏:CodeTimeCodeTime

if else语句

if用于条件判断逻辑控制语句。

if 语法:

12345678

#多行写法if 条件then 命令fi#单行写法if 条件; then 命令; fi

if else 语法:

123456

if 条件then 命令else 命令fi

if elif else 语法:

12345678910111213

if 条件1then 命令1elif 条件2then 命令2elif 条件3then 命令3……else 命令Nfi

示例:

123456789101112131415

#!/bin/bashread -p "请输入你的考试成绩:" scoreif (( $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

(())是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( a == b ))判断条件成立,进入 if,执行 then 后边的 echo 语句。更多关于(())的介绍,可参考Linux Shell - 运算符。

if条件判断句的退出状态

linux任何命令的的执行都会有一个退出状态,无论是内置命令还是外部文件命令,还是自定义的 Shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这就是命令的退出状态。 大多数命令状态0代表成功,非0代表失败。也有特殊的命令,比如 diff 命令用来比较两个文件的不同,对于“没有差别”的文件返回 0,对于“找到差别”的文件返回 1,对无效文件名返回 2。 Shell 中,有多种方式取得命令的退出状态,其中 $? 是最常见的一种。

退出状态和逻辑运算符的组合

Shell if 语句使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。

运算符

使用格式

说明

&& 或 -a

条件1 && 条件2

逻辑与运算符,当 条件1 和 条件2 同时成立时,整个表达式才成立。 如果检测到 条件1 的退出状态为 0,就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么,整个表达式必然都是不成立的,检测了也是多此一举。

|| 或 -o

条件1 || 条件2

逻辑或运算符,条件1 和 条件2 两个表达式中只要有一个成立,整个表达式就成立。 如果检测到 条件1 的退出状态为 1,就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。

!

!条件

逻辑非运算符,相当于”取反“的效果。如果 条件 成立,那么整个表达式就不成立;如果 条件 不成立,那么整个表达式就成立。

演示:

1234567891011

#!/bin/bashread -p "请输入文件全名: " filenameread -p "请输入数据:" dataif [ -w $filename -a -n $data ]then echo $data echo $data > $filename echo "成功"else echo "失败"fi

test命令用于对文件或字符串进行检测, -w 判断文件是否存在并且可写,-n 用于检测字符串是否非空,data >

由于布尔运算符-a只能用在[]中,而[]会发生word splitting,即字符串会按空格进行分割,这样一来$data中就不能包含空格,有2种办法可以解决这个问题:

  1. data加上双引号:if [ -w filename -a -n "
  2. 使用逻辑运算符&&并配合[[]]:if [[ -w

case语句

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令;当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

1234567891011121314151617

case 值 in匹配模式1) 命令1 命令2 ... ;;匹配模式2) 命令1 命令2 ... ;;*) 命令1 命令2 ... ;;esac

每一匹配模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;(类似break)。取值将检测匹配的每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 caseinesac 都是 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”。

演示:

12345678910111213141516171819202122232425262728

#!/bin/bashread -p "请输入一个0~7的数字:" numbercase $number in1) echo "星期一" ;;2) echo "星期二" ;;3) echo "星期三" ;;4) echo "星期四" ;;5) echo "星期五" ;;6) echo "星期六" ;;0|7) echo "星期日" ;;*) echo "您输入的数字无效" ;; esac

while语句

whlie用于循环执行一系列命令。

123456789101112

#多行写法while 条件do 命令1 命令2 ... continue; # 结束当前这一次循环, 进入下一次循环 break; # 结束当前循环done#一行写法while 条件; do 命令; done;

演示:指定输出多少次hello world

12345678

#!/bin/bashread -p "请输入一个数字:" numberi=0while [[ $i < $number ]]do echo "hello world" ((i++))done

无限循环语法:

1234

while true # 或者使用 while :do commanddone

until语句

until 也是循环结构语句,until 循环与 while 循环在处理方式上刚好相反,循环条件为false会一直循环,条件为true停止循环。

1234

until 条件do 命令done

条件如果返回值为1(代表false),则继续执行循环体内的语句,否则跳出循环。

示例:指定输出多少次hello world

12345678

#!/bin/bashread -p "请输入一个数字:" numberi=0until [[ ! $i < $number ]] # while 语句中是 while [[ $i < $number ]]do echo "hello world" ((i++))done

该例子和上文中的while示例实现的是同样的效果。

for语句

与其他编程语言类似,Shell同样支持for循环。

循环方式一

12345678910

#多行写法for var in item1 item2 ... itemNdo 命令1 命令2 ...done#单行写法for var in item1 item2 ... itemN; do 命令1; 命令2…; done;

var是循环变量,item1 item2 ... itemN 是循环的范围。

示例:输出5次hello world

12345

#!/bin/bashfor i in 1 2 3 4 5do echo "hello world"done

循环方式二

12345678

#多行写法for var in {start..end}do 命令done#单行写法for var in {start..end}; do 命令; done

start表示循环范围的起始值,必须为整数end表示循环范围的结束值,必须为整数

示例:循环1到5并打印

1

for i in {1..5}; do echo $i; done

循环方式三

12345678

#多行写法for((i=start;i<=end;i++))do 命令done#单行写法for((i=start;i<=end;i++)); do 命令; done

示例:打印5次hello world

1

for((i=1;i<=5;i++)); do echo "hello world ${i}"; done

无限循环语法:

1

for((;;)); do 命令; done

select语句

select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。 select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景,而其他语言则没有。

1234

select var in menu1 menu2 ...do 命令done

注意:select 是无限循环(死循环),输入空值,或者输入的值无效都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。 执行命令过程中,终端会输出 #? 代表可以输入选择的菜单编号。

示例1:

12345678

#!/bin/bashecho "你的爱好是什么?"select hobby in "编程" "游戏" "篮球" "游泳"do echo $hobby breakdoneecho "你的爱好是:${hobby}"

示例2:

123456789101112131415161718192021

#!/bin/bashecho "你的爱好是什么"select hobby in "编程" "游戏" "篮球" "游泳"do case $hobby in "编程") echo "编程,多敲代码" break ;; "游戏") echo "少玩游戏" break ;; "篮球"|"游泳") echo "${hobby}运动有利健康" break ;; *) echo "输入错误,请重新输入" esacdone

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • if else语句
    • if条件判断句的退出状态
      • 退出状态和逻辑运算符的组合
      • case语句
      • while语句
      • until语句
      • for语句
        • 循环方式一
          • 循环方式二
            • 循环方式三
            • select语句
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档