脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - shell - shell 流程控制语句的具体使用

shell 流程控制语句的具体使用

2023-05-09 13:45逆风飞翔的小叔 shell

本文主要介绍了shell 流程控制语句的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

可以说,在任何一门编程语言中都离不开流程控制语句,使用流程控制语句可以帮助程序处理各类复杂的操作,常用的流程控制语句,比如: if-else,while,for循环等,在linux 的shell 编程语法中,也提供了丰富的流程控制语句,接下来将一一做详细的说明。

 

一、if - else 语句

if 语法

?
1
2
3
4
if  条件
then
    命令
fi

if - else 语法

?
1
2
3
4
5
6
if  条件
then
   命令
else
   命令
fi

if elif else 语法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 脚本内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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 ,观察输出效果

shell 流程控制语句的具体使用

补充说明

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

 

二、case语句

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

case 语法结构

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 语句案例演示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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脚本,观察输出效果

shell 流程控制语句的具体使用

 

三、while 语句

while 语法

?
1
2
3
4
5
6
7
8
while 条件
do
    命令1
    命令2
    ...
    continue; # 结束当前这一次循环, 进入下一次循环
    break; # 结束当前循环
done

一个简单的案例

?
1
2
3
4
5
6
7
8
#!/bin/bash
read -p "请输入一个数字:" number
i=0
while [[ $i < $number ]]
do
  echo "hello world :" $i
  ((i++))
done

执行上面的shell 脚本,观察输出效果

shell 流程控制语句的具体使用

使用while语句可以实现无限循环,写法如下

?
1
2
3
4
while :
do
    command
done

或者下面这样

?
1
2
3
4
while true
do
    command
done

 

四、until语句

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

until 语法

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

?
1
2
3
4
until 条件
do
    命令
done

案例演示

?
1
2
3
4
5
6
7
8
#!/bin/bash
read -p "请输入一个数字:" number
i=0
until [[ ! $i < $number ]]
do
  echo "hello world : " $i
  ((i++))
done

执行上面的shell脚本,观察输出效果

shell 流程控制语句的具体使用

 

五、for语句

 

for 语法写法一

?
1
2
3
4
5
6
for var in item1 item2 ... itemN
do
    命令1
    命令2
    ...
done

1、var是循环变量

2、item1 item2 ... itemN 是循环的范围

演示案例

?
1
2
3
4
5
#!/bin/bash
for i in 1 2 3 4 5
do
 echo "hello world :" $i
done

执行上面的脚本,观察输出效果

shell 流程控制语句的具体使用

 

for 语法写法二

语法结构

?
1
2
3
4
for var in {start..end}
do
    命令
done

start: 循环范围的起始值,必须为整数

end: 循环范围的结束值, 必须为整数

案例演示

?
1
2
#! /bin/bash
for i in {1..5}; do echo $i; done

运行这段脚本,观察输出效果

shell 流程控制语句的具体使用

 

for 语法写法三

语法结构

这种写法相信做过应用端编程开发的同学更熟悉点吧

?
1
2
3
4
for((i=start;i<=end;i++))
do
    命令
done

也可以简写成一行

for((i=start;i<=end;i++)); do 命令; done

案例演示

?
1
2
#! /bin/bash
for((i=0;i<=3;i++)); do echo "hello word : " $i; done

运行上面的sql,观察执行效果

shell 流程控制语句的具体使用

 

无限for循环

在某些特殊的场景下,需要程序无限循环下去,可以参考下面的写法

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

 

六、select 语句

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

select 语法

?
1
2
3
4
select var in menu1 menu2 ...
do
    命令
done

注意:

1、select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环;

2、执行命令过程中: 终端会输出 #? 代表可以输入选择的菜单编号;

案例演示1

?
1
2
3
4
5
6
7
8
#!/bin/bash
echo "你的爱好是什么?"
select hobby in "编程" "游戏" "篮球" "游泳"
do
    echo $hobby
    break
done
echo "你的爱好是:${hobby}"

运行上面的shell观察执行效果

shell 流程控制语句的具体使用

案例演示2

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
echo "你的爱好是什么"
select hobby in "编程" "游戏" "篮球" "游泳"
do
    case $hobby in
        "编程")
            echo "编程,多敲代码"
            break
            ;;
        "游戏")
            echo "少玩游戏"
            break
            ;;
        "篮球"|"游泳")
            echo "运动有利健康"
            break
            ;;
        *)
            echo "输入错误,请重新输入"
    esac
done

运行上面的shell,观察执行效果

shell 流程控制语句的具体使用

接下来,补充几个比较重要的关于shell操作中的知识点

 

八、文件测试 test

在使用shell编程过程中,经常涉及到对各类文件,文件目录的操作,比如判断文件目录是否存在,文件里面的内容是否存在等,就需要用到文件测试相关的命令,下面总结的是和文件测试操作相关的语法。

参数 说明
==-e 文件名== exists, 如果文件存在则为真
==-r 文件名== read,如果文件存在且可读则为真
==-w 文件名== write,如果文件存在且可写则为真
==-x 文件名== execute,如果文件存在且可执行则为真
==-s 文件名== string,如果文件存在且至少有一个字符则为真
==-d 文件名== directory,如果文件存在且为目录则为真
-f 文件名 file,如果文件存在且为普通文件则为真
-c 文件名 character,如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

案例演示

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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 流程控制语句的具体使用

补充说明

Shell提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低, 语法,如下:

test 条件1 -o 条件2 -a 条件3 ...

 

九、整数和字符串比较 test

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

功能与[]一样。

整数比较测试

?
1
2
3
4
if test 数字1 options 数字2
then
...
fi

options具体如下

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

整数比较具体案例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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,观察执行效果

shell 流程控制语句的具体使用

 

字符串比较测试

语法结构

参数 说明
= 或 == 等于, 等于返回0代表成功,否则返回1代表失败
!= 不等于
< 小于
> 大于
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

字符串比较具体案例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/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 流程控制语句的具体使用的文章就介绍到这了,更多相关shell 流程控制语句内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/congge_study/article/details/126913861

延伸 · 阅读

精彩推荐