Shell脚本基础从头开始(九)── shell的循环语句控制

前言

通过前面的条件判断以及循环语句的学习,我们已经可以使用shell脚本做很多事了。但是很多时候,循环语句可能需要一些特别的控制,比如说我要求 1 加到 100 偶数的和,当然,你可以使用普通的循环,把每次循环增加的值(步长)改为 2 就可以做到,这样确实可以做到。那如果我需要做这样一个需求,从一堆文件中内容里面找到某个内容,这肯定需要循环,把每个文件的内容读出来确认是不是要找的,如果我的运气特别好,读到第一个文件发现就找到了想要的内容,这时候余下的文件是不是就没必要去循环处理了?遇到上面两种场景,循环语句配合continuebreadk关键字就可以很好的解决问题了。

continue

含义作用:跳过本次循环,继续执行下一次循环。

例如求 1 到 100 的偶数和,这时候使用 continue 也可以很好的解决问题,只需要在每次相加前判断当前要相加的数是不是偶数,如果不是则跳过。

#!/bin/bash

# 求 1 到 100 的偶数和
sum=0
for ((i=0;i<100;i++))
do
        if [ `expr $i % 2` -ne 0 ]
        then
                # 奇数,直接跳过,进入下一次循环
                continue
        fi
        # 是偶数 才参与相加
        sum=$(($sum+$i))
done
echo "偶数和是:$sum"

通过上面的例子,相信大家已经认识到了 continue 关键字的作用。

break

需求:要在一个集合中是否存在某个元素。
这时候很大可能就需要用到break了,比如我们提前找到了需要的元素,这时候其实就没必要再循环下去了。

#!/bin/bash
# break 的使用
for i in "张三" "李四" "王五" "赵六" "钱七"
do
	if [ $i = "王五" ]
	then
		echo "找到了集合中的 王五,循环结束"
		# 执行 break 以后,整个循环结束,程序继续向下执行
		break
	fi
done

shift 命令

通过前面的学习我们知道,对于位置变量或命令行参数,其个数必须是确定的,或者当 Shell 程序不知道其个数时,可以把所有参数一起赋值给变量$*。若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,这时候就需要借用到shift命令了。
例如 当脚本获得的位置变量如下
$1=file1 $2=file2 $3=file3
则执行依次shift命令后,各位置变量变为
$1=file2 $2=file3
例如,我们要写一个求和的shell脚本就可以这么完成

getSum.sh

#!/bin/bash
# shift 命令使用案例

sum=0
while [ $# -gt 0 ]
do
	sum=$(($sum+$1))
	shift
done
echo "求和结果是:$sum"

执行脚本 ./getSum.sh 1 2 3 4 5就可以看到正确的计算结果了。

函数

函数,对于有过编程基础的人来说一定不陌生,但是对于之前没有编程经验的人来说,这个名词还是有点抽象。
函数,在某些编程语言里也叫方法,是一组语句的封装以完成某个特定功能,以便达到复用的目的。
函数可以很简单也可以很复杂。

函数的定义

shell 中定义函数的基本语法如下:

function 函数名(){
	函数体(函数的具体内容),也就是你要封装的shell语句
}

函数的使用

下面我定义一个最简单的函数,其作用是调用的时候输出当前时间

#!/bin/bash
# 函数的定义与使用

# 定义函数
function printDate(){
	 strDate=`date +%Y年%m月%d日`
	echo "当前日期是: $strDate"
}

# 调用函数(使用函数),函数不调用是不会执行的
printDate

当然,函数也可以传参,比如我们可以把上面求和的封装为一个函数

#!/bin/bash

function getSum(){
	sum=0
	while [ $# -gt 0 ]
	do
		sum=$(($sum+$1))
		shift
	done
	echo "求和结果是:$sum"
}

# 调用函数 需要传参,不过说实话这个语法很怪异,其他语言调用方法时都是带括号,传的参数也在括号里
getSum 1 2 3 4 5 

函数的封装不但有利于代码的复用,而且方便代码阅读,把一个个功能封装为函数,在需要的时候调用,这样的代码层次分明,便于阅读和修改。

今天的内容就分享到这里了,函数的使用会在以后的例子中频繁出现,用的多了慢慢也就熟悉了。好了,今天的内容就分享到这里了,大家晚安。

系列传送门如下:
Shell脚本基础从头开始(一)── 几个linux实操技巧
Shell脚本基础从头开始(二)── 输出重定向
Shell脚本基础从头开始(三)── linux的权限管理
Shell脚本基础从头开始(四)── 第一个shell脚本
Shell脚本基础从头开始(五)── shell的输入输出
Shell脚本基础从头开始(六) ── shell条件测试
Shell脚本基础从头开始(七)── shell的流程控制
Shell脚本基础从头开始(八)── shell的循环语句
Shell脚本基础从头开始(十)── shell的文本过滤
Shell脚本基础从头开始(十一)── shell的文本过滤(二)
Shell脚本基础从头开始(十二)── 制作一个字符菜单
Shell脚本基础从头开始(完结篇)── 利用shell编写监控脚本以及shell操作数据库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不务正业的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值