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

Shell流程控制

作者头像
乐心湖
发布2021-01-18 14:55:16
2.5K0
发布2021-01-18 14:55:16
举报
文章被收录于专栏:MyTechnology

Shell基础入门

linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等?使用linux的内核操作计算机的硬件Shell介绍...

Shell计算命令

Shell计算命令:expr命令详解介绍expr (evaluate expressions 的缩写),译为“表达...

Shell流程控制

流程控制:if else语句if语法多行写法语法if 条件 then 命令 fi可以将if语句放入一行语...

Shell函数定义

Shell函数:系统函数函数介绍Shell编程和其他编程语言一样, 有函数, 函数是由若干条shell命令组成的...

Shell实用工具

Shell好用的工具: cut使用cut可以切割提取指定列字符字节的数据介绍cut 译为“剪切, 切割”,是一个...

Shell常见的面试题

面试题:查空行问题:使用Linux命令查询 file1.txt 中空行所在的行号file1.txt数据准备xn20...

流程控制:if else语句

if语法

多行写法语法

代码语言:javascript
复制
if  条件
then
    命令
fi

可以将if语句放入一行语法 if 条件; then 命令; fi

if else 语法

代码语言:javascript
复制
if  条件
then
   命令
else
   命令
fi

if elif else 语法

代码语言:javascript
复制
if  条件1
then
   命令1
elif 条件2
then
    命令2
elif 条件3
then
    命令3
……
else
   命令N
fi

演示

需求

代码语言:javascript
复制
提示"请输入你的考试成绩:" 接收用户输入一个成绩, 之后使用if else条件句判断
要求1: 小于60 输出"不及格"
要求2: 大于等于70 并且 小于80 输出"中等"
要求3: 大于等于80 并且 小于90 输出"良好"
要求4: 大于等于90 并且 小于等于100 输出"优秀"
要求5: 以上不符合输出"成绩不合法"

control1.sh脚本代码

代码语言:javascript
复制
#!/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

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

运行效果

小结

使用if条件语句进行条件判断

代码语言:javascript
复制
if 条件1 
then
    命令1
elif 条件2 
then
    命令2
elif 条件3 
then
    命令3
...
else 
    命令n
fi

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 的退出状态是什么,整个表达式必然都是成立的,检测了也是多此一举。

!

!条件

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

示例

需求:

提示输入"请输入文件全名: "和"请输入数据:" 并接收文件名与数据

使用逻辑运算符判断满足2 条件 : 文件需要具有可写权限 和 输入的数据长度不为0

满足以上2个条件 将用户输入的 数据 写入到指定的文件中去

步骤:

创建 itheima.txt

代码语言:javascript
复制
touch itheima.txt

control2.sh脚本文件代码

代码语言:javascript
复制
#!/bin/bash
read -p "请输入文件全名: " filename
read -p "请输入数据:" data
if [ -w $filename -a -n $data ]
then
        echo $data
        echo $data > $filename
        echo "成功"
else
        echo "失败"
fi

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

运行结果

小结

1.什么是退出状态

每个命令运行后都会返回一个退出状态值, 大多数返回0代表成功, 非0 代表失败

2.查询每个命令的退出状态

常见命令 $?

Shell内置命令:test

  1. 理解test命令对整数比较测试
  2. 理解test命令对字符串
  3. 能够使用test命令对文件测试

介绍

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

整数比较测试

语法

代码语言:javascript
复制
if test 数字1 options 数字2 
then  
...
fi

options具体如下

参数

说明

-eq

等于则为真

-ne

不等于则为真

-gt

大于则为真

-ge

大于等于则为真

-lt

小于则为真

-le

小于等于则为真

演示

control3.sh脚本代码

代码语言:javascript
复制
#!/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

运行效果

字符串比较测试

语法

参数

说明

= 或 ==

等于, 等于返回0代表成功,否则返回1代表失败

!=

不等于

\<

小于

>

大于

-z 字符串

字符串的长度为零则为真

-n 字符串

字符串的长度不为零则为真

演示

control4.sh脚本代码

代码语言:javascript
复制
#!/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

运行效果

文件测试

语法

参数

说明

-e 文件名

exists, 如果文件存在则为真

-r 文件名

read,如果文件存在且可读则为真

-w 文件名

write,如果文件存在且可写则为真

-x 文件名

execute,如果文件存在且可执行则为真

-s 文件名

string,如果文件存在且至少有一个字符则为真

-d 文件名

directory,如果文件存在且为目录则为真

-f 文件名

file,如果文件存在且为普通文件则为真

-c 文件名

character,如果文件存在且为字符型特殊文件则为真

-b 文件名

如果文件存在且为块特殊文件则为真

演示

查询control1.sh与control2.sh文件

control5.sh脚本代码

代码语言:javascript
复制
#!/bin/bash
if test -w ./control1.sh
then
    echo '文件已存在并且可写!'
else
    echo '文件不存在或不可写!'
fi

if test -e ./control1.sh -a -e ./control2.sh
then
    echo '两个文件都存在!'
else
    echo '可能有一个或两个文件不存在'
fi

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

运行效果

小结

  1. test命令对整数比较测试

test 整数1 options 整数2 options: lt le gt ge eq ne

  1. test命令对字符串比较测试

test 变量1 options 变量2 options: > < != = == < > 需要转义

  1. 使用test命令对文件测试

test options 文件路径字符串 options: -w -r -e -x -s -d

注意: test命令与[] 功能一样

流程控制:case语句

介绍

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令;

当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

语法

代码语言:javascript
复制
case 值 in
匹配模式1)
    命令1
    命令2
    ...
    ;;
匹配模式2)
    命令1
    命令2
    ...
    ;;
*)
    命令1
    命令2
    ...
    ;;
esac

每一匹配模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; (类似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"。

演示

control6.sh脚本代码

代码语言:javascript
复制
#!/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

运行效果

小结

使用case多分支条件判断语法

case 表达式 in 模式1) 命令 ... ;; 模式2) 命令 ... ;; ... *) 命令 ... ;; esac

流程控制:while语句

语法

多行写法

代码语言:javascript
复制
while 条件
do
    命令1
    命令2
    ...
    continue; # 结束当前这一次循环, 进入下一次循环
    break; # 结束当前循环
done

一行写法

代码语言:javascript
复制
while 条件; do 命令; done;

演示

control7.sh脚本文件代码: 输出指定多少次的hello world

代码语言:javascript
复制
#!/bin/bash
read -p "请输入一个数字:" number
i=0
while [[ $i < $number ]]
do
  echo "hello world"
  ((i++))
done

运行效果

无限循环

代码语言:javascript
复制
while :
do
    command
done

代码语言:javascript
复制
while true
do
    command
done

小结

whlie循环的使用语法

while 条件 do ​ 命令 done

流程控制:until语句

介绍

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

语法

代码语言:javascript
复制
until 条件
do
    命令
done

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

演示

control8.sh脚本代码

代码语言:javascript
复制
#!/bin/bash
read -p "请输入一个数字:" number
i=0
until [[ ! $i < $number ]]
do
  echo "hello world"
  ((i++))
done

运行效果

小结

until循环结构的使用语法

until 条件 do ​ 命令 done 条件为false继续循环, 为true停止循环

流程控制:for语句

介绍

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

循环方式1

语法

多行写法

代码语言:javascript
复制
for var in item1 item2 ... itemN
do
    命令1
    命令2
    ...
done

一行写法

代码语言:javascript
复制
for var in item1 item2 ... itemN; do 命令1; 命令2…; done;

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

演示

control9.sh脚本代码

代码语言:javascript
复制
#!/bin/bash
for i in 1 2 3 4 5
do
 echo "hello world"
done

运行效果

循环方式2

语法

多行写法

代码语言:javascript
复制
for var in {start..end}
do
    命令
done

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

一行写法

代码语言:javascript
复制
for var in {start..end}; do 命令; done

演示

循环1到5并打印

代码语言:javascript
复制
for i in {1..5}; do echo $i; done

效果

循环方式3

语法

多行写法

代码语言:javascript
复制
for((i=start;i<=end;i++))
do
    命令
done

一行写法

代码语言:javascript
复制
for((i=start;i<=end;i++)); do 命令; done

演示

无限循环

代码语言:javascript
复制
for((;;)); do 命令; done

小结

使用for进行循环操作的3种方式

方式1: for i in item1 item2 ...; do 命令; done 方式2: for i in {start..end}; do 命令; done 方式3: for((i=start;i<=end;i++)); do 命令; done

流程控制:select语句

介绍

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

语法

代码语言:javascript
复制
select var in menu1 menu2 ...
do
    命令
done

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

演示1

脚本代码

代码语言:javascript
复制
#!/bin/bash
echo "你的爱好是什么?"
select hobby in "编程" "游戏" "篮球" "游泳"
do
    echo $hobby
    break
done
echo "你的爱好是:${hobby}"

运行效果

演示2

脚本文件代码

代码语言:javascript
复制
#!/bin/bash
echo "你的爱好是什么"
select hobby in "编程" "游戏" "篮球" "游泳"
do
    case $hobby in
        "编程")
            echo "编程,多敲代码"
            break
            ;;
        "游戏")
            echo "少玩游戏"
            break
            ;;
        "篮球"|"游泳")
            echo "运动有利健康"
            break
            ;;
        *)
            echo "输入错误,请重新输入"
    esac
done

运行效果

小结

select的作用

用于交互式循环输入选择菜单 常与 case in 一起配合使用


版权属于:乐心湖's Blog

本文链接:https://cloud.tencent.com/developer/article/1774940

声明:博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 流程控制:if else语句
    • if语法
      • if else 语法
        • if elif else 语法
          • 演示
            • 小结
            • if条件判断句的退出状态
              • 介绍
                • 演示
                  • 退出状态和逻辑运算符的组合
                    • 示例
                      • 小结
                      • Shell内置命令:test
                        • 介绍
                          • 整数比较测试
                            • 语法
                            • 演示
                          • 字符串比较测试
                            • 语法
                            • 演示
                          • 文件测试
                            • 语法
                            • 演示
                          • 小结
                          • 流程控制:case语句
                            • 介绍
                              • 语法
                                • 演示
                                  • 小结
                                  • 流程控制:while语句
                                    • 语法
                                      • 演示
                                        • 无限循环
                                          • 小结
                                          • 流程控制:until语句
                                            • 介绍
                                              • 语法
                                                • 演示
                                                  • 小结
                                                  • 流程控制:for语句
                                                    • 介绍
                                                      • 循环方式1
                                                        • 语法
                                                        • 演示
                                                      • 循环方式2
                                                        • 语法
                                                        • 演示
                                                      • 循环方式3
                                                        • 语法
                                                        • 演示
                                                      • 无限循环
                                                        • 小结
                                                        • 流程控制:select语句
                                                          • 介绍
                                                            • 语法
                                                              • 演示1
                                                                • 演示2
                                                                  • 小结
                                                                  领券
                                                                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档