Linux Shell入门学习(五)

本文深入讲解Shell脚本中的流程控制语句,包括if...else条件判断、case多选择、for循环、while循环及until循环的使用方法,通过实例演示如何进行数值比较、字符串匹配和循环操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Shell中的流程控制

在shell脚本中也有各种各样的流程控制语句,例如if…else,case , while,for循环语句等等。尽管这些流程控制语句的含义和其他语言都是一样的,但是其使用细节和C/C++语言里面的使用有些许不同。接下来就一一来看一下这些流程控制语句的使用,也会结合上篇文章中的各种运算符。

2. if…else

if…else是条件判断语句,根据if…else的数目大致可以分为单if语句,if…else语句以及if…elseif…else语句。
单if语句的一般形式:

if 条件
then 
    代码块
fi

如果满足条件则执行代码块。fi是if反过来写,表示该if语句到此结束。
if…else语句的一般形式:

if 条件
then 
    代码块1
else
    代码块2
fi

如果满足条件则执行代码块1,不满足则执行代码块2。
多if…else的一般形式:

if 条件1
then 
    代码块1
elif 条件2
then
    代码块2
else
	代码块3
fi

如果满足条件1则执行代码1,满足条件2则执行代码块2,否则就执行代码块3.
看一个实例:判断两数是否相等。

#!/bin/bash
a=1
b=1
if [ $a==$b ]
then 
	echo "两数相等"
else
	echo "两数不相等"
fi

除了使用==号来判断两数相等,也可以用-eq来判断是否相等。上一篇文章的运算符中有讲,如下:

#!/bin/bash
a=1
b=1
if [ $a -eq $b ]
then 
	echo "两数相等"
else
	echo "两数不等"
fi

有两点需要强调:

1.if语句结束后记得要带上fi,以表示if语句到此结束。
2.在判断条件中,中括号两边和变量之间都要有空格。

看完两数相等,再看一个比较数字大小的shell,充分利用if…else以及一些其他比较运算符。

#!/bin/bash
a=1
b=2
if [ $a -eq $b ]
then 
	echo "两数相等"
elif [ $a -gt $b ]
then 
	echo "a大于b"
else
    echo "b大于a"
fi

3. case语句

case为多选择语句,当分支多,判断条件简单时可以采用case语句。case语句的一般形式如下:

case 值 in
值1)
	代码块1
;;2)
    代码块2
;;3)
    代码块3
;;
*)
  代码块4
;;
esac   

当case中的值与值1,值2或值3其中的值相等时,就会执行相对应的代码块。*则表示如果case中的值与1,2,3都不匹配,则执行代码块4.类似于c语言switch语句中的default。另外,每一个代码块后跟着两个分号,类似于c语言中的break,表示一旦执行完匹配的代码块后不再匹配其他的值。举例,如果case中的值与值1匹配,执行代码块1之后就跳出该case语句。
esac是case反过来的写,表示一个case语句的结束。接下来看几个实例:

#!/bin/bash
echo "请输入1,2,3其中一个数字"
read num
case $num in
1)
	echo "你输入了1"
;;
2)
	echo "你输入了2"
;;
3)
	echo "你输入了3"
;;
*)
	echo "你输入的数字不是1,2,3中的一个"
;;
esac

在本例中case中的待匹配的值,我们使用了一个变量num,但其实该值不仅仅可以是一个变量,还可以是一个表达式甚至是命令的结果等等。上面列举的例子是shell中的case最常见的用法。

4. for循环语句

在shell中,for循环有两种一般的书写形式,分别是c语言风格和Python风格的for循环。先来看c语言风格的for语句:

for((exp1;exp2;exp3))
do
    代码块
done

for循环的运行过程为:执行exp1,判断exp2是否为真,如果为假,直接跳出for循环;如果为真,就执行代码块,再执行exp3;此后的循环顺序就是判断exp2->代码块2->exp3,只要exp2为真就一直循环知道exp2为假结束循环。
说了这么多,其实挺啰嗦的,学过编程的这个语句应该也是一看就懂了。下面用一张流程图说明该过程:
在这里插入图片描述
再通过一个简单的例子看一下shell中for循环的使用

#!/bin/bash
sum=0
for ((i=1;i<=10;i++))
do
	((sum+=i))
done
echo "1+..+10=${sum}"

在for循环中的三个表达式任何一个都是可以省略的,甚至极端时三个也可以省略:

for ((;;))

Python风格的for循环:

for val in value_list
do 
   代码块
done

其中val表示变量,value_list表示取值列表,每一次循环都会从value_list中按顺序取出一个值赋给val,val被赋值后再进入到循环体的代码块中运行,直到取值列表的值都被取完了,循环也就结束了。
对于取值列表,我们既可以给出其具体的值,也可以给出一个范围,也可以由某个命令的输出作为取值列表。

看下面这个实例,就是把取值列表的每一个具体的值都给出来。

#!/bin/bash
sum=0
for val in 1 2 3 4 5
do
	((sum+=val))
done
echo "1+..5=${sum}"

但是如果要计算1到100,或者1到500的和,显然不可能像上例中一样给具体的值。但是我们可以通过指定一个取值范围,简化取值列表。
取值范围的语法如下:

{start..end}

注意:起始值和终止值之间是由两个点号连接。
了解了语法之后,我们来计算一下1到100的和。

#!/bin/bash
sum=0
for val in {1..100}
do 
	((sum+=val))
done
echo "1+..100=$sum"

再来看看由命令的输出作为取值列表的例子:

#!/bin/bash
sum=0
for val in $(seq 100)
do
	((sum+=val))
done
echo "1+..+100=$sum"

seq命令是产生序列的命令。seq命令的用法在我另一篇博客seq详解有详细介绍。

5. While语句

while语句也是shell中比较常用的循环语句,其工作流程就是当满足条件时,执行循环体,一旦条件不满足就跳出循环。其一般形式为:

while 条件
do
	代码块
done

使用while循环计算10以内的和。

#!/bin/bash
sum=0
i=0
while ((i<=10))
do
	((sum+=i))
	((i++))
done
echo "1+..+10=$sum"

6. until语句

until语句也是一个循环控制的语句,和while差不多的用法。只不过while是判断条件为真时进入循环体,until则是判断条件为假的进入循环体。其一般形式和while也是一样的。

until 条件
do
	代码块
done

下面来看一下until语句如何计算1到10的和。

#!/bin/bash
sum=0
i=0
until ((i>10))
do
	((sum+=i))
	((i++))
done
echo "1+..+10=$sum"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值