目录
- 前言
- continue
- break
- shift 命令
- 函数
- 函数的定义
- 函数的使用
前言
通过前面的条件判断以及循环语句的学习,我们已经可以使用shell脚本做很多事了。但是很多时候,循环语句可能需要一些特别的控制,比如说我要求 1 加到 100 偶数的和,当然,你可以使用普通的循环,把每次循环增加的值(步长)改为 2 就可以做到,这样确实可以做到。那如果我需要做这样一个需求,从一堆文件中内容里面找到某个内容,这肯定需要循环,把每个文件的内容读出来确认是不是要找的,如果我的运气特别好,读到第一个文件发现就找到了想要的内容,这时候余下的文件是不是就没必要去循环处理了?遇到上面两种场景,循环语句配合continue、breadk关键字就可以很好的解决问题了。
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
函数的封装不但有利于代码的复用,而且方便代码阅读,把一个个功能封装为函数,在需要的时候调用,这样的代码层次分明,便于阅读和修改。
今天的内容就分享到这里了,函数的使用会在以后的例子中频繁出现,用的多了慢慢也就熟悉了。好了,今天的内容就分享到这里了,大家晚安。
