Shell编程之循环语句与函数

使用 while 循环语句

for 语句的结构

使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复 执行相同的命令序列,直到变量值用完退出循环。在这里;取值列表”称为 for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP 黑名单)。

for 循环语句的语法结构如下所示。

for 变量名 in 取值列表 do 命令序列 done

上述语句结构中,for 语句的操作对象为用户指定名称的变量,并通过in 关键字为该变 量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do…done 之间的命令序列称为循环体,其中的执行语句需要引用变量以完成相应的任务。

for 语句的执行流程:首先将列表中的第一个取值赋给变量,并执行 do…done 循环体 中的命令序列;然后将列表中的第二个取值赋给变量,并执行循环体中的命令序列……依此类推,直到列表中的所有取值用完,最后将跳至done   语句,表示结束循环。

使用 while 循环语句

for 循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场 合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另外一种循环——while 语句。

while  语句的结构

使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再  满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行。 因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。

while 循环语句的语法结构如下所示。

while 条件测试操作 do 命令序列 done

while 语句的执行流程:首先判断 while 后的条件测试操作结果,如果条件成立,则执 行 do…don e 循环体中的命令序列;返回 while 后再次判断条件测试结果,如果条件仍然成 立,则继续执行循环体;再次返回到 while后,判断条件测试结果……如此循环,直到 while后的条件测试结果不再成立为止,最后跳转到 done  语句,表示结束循环。

使用 while 循环语句时,有两个特殊的条件测试操作,即 true ( 真 ) 和false (假)。使 用 true 作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制 终止脚本(或通过 exit 语句退出脚本);反之,若使用false  作为条件,则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。

until 语句的结构

until  循 环 与 while 循 环 类 似 ,while   循环能实现的脚本 until  同样也可以实现,但区别是while   循环在条件为真是继续执行循环,而 until  则是在条件为假时执行循环。

until  循环语句的语法结构如下所示。

until 条件测试操作 do done

until 语句的执行流程:首先判断 until 后的条件测试操作结果,如果条件不成立,则执 行 do…done    循环体中的命令序列;返回 until 后再次判断条件测试结果,如果条件仍然不 成立,则继续执行循环体;再次返回到until 后,判断条件测试结果……如此循环,直到 until后的条件测试结果成立为止,最后跳转到 done  语句,表示结束循环。

 Shell 函数

函数的用法

Shell  函数可用于存放一系列的指令。在 Shell  脚本执行的过程中,函数被置于内存中, 每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在 Shell 编程中函数并非是必 须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。

Shell  函数定义的方法如下所示:

[function] 函数名(){ 命令序列 [return x]

>   “function”关键字表示定义一个函数,可以省略;

>   “{”符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行的句首;

>  “y”符号表示函数体结束,两个大括号之间{}是函数体;

>   “命令序列”部分可以是任意的 Shell 命令,也可以调用其他函数;

>   “return ”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用 exit 终止整个 Shell 脚本。

Shell 函数调用的方法为:函数名[参数 1][参 数 2]。

函数变量的作用范围

在 Shell  脚本中函数的执行并不会开启一个新的子 Shell,    而是仅在当前定义的 Shell 环境中有效。如果 Shell 脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。 在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令l ocal 来实现。函 数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响。

函数的参数

函数的参数的用法如下。

函数名称参数1 参数 2 参数3……

在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多 个参数,参数使用$1、$2、$3  ……的方式表示。以此类推,从第10个参数开始,调用方法

为${10},不加大括号无法调用成功。

递归函数

Shell  也可以实现递归函数,就是可以调用自己本身的函数。在Linux  系统上编写 Shell  脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和目录,逐层递归列出,并

对这些层级关系进行展示。

Shell 数组

在 Shell  脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度、 获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。Shell  中的数组与 Java 、 C 、Python  不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要事先 定义。 Shell 数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从 0 开始。

数组常用定义方法包括以下几种。

方法一:

数组名= (value0 value1 value2  …)

方法二:

数组名=([0]=value [1]=value [2]=value …)

方法三:

列表名=“value0 value1 value2 … ”

数组名=($列表名)

方法四;

数组名[0]=“value”

数组名[1]=“value”

数组名[2]=“value”

下面通过具体的示例掌握数组的基本使用方法。

(1)获取数组长度

[root@localhost~]# arr_number=(12345)

[root@localhost~]#arr_length=${#arr_number[*]}

[root@localhost~]# echo $arr_length

5

[root@localhost~]#arr_length_1=${#arr_number[@]}

[root@localhost~]#    echo   $arr_length_1

5

(2)读取某下标赋值

[root@localhost ~]#arr_index2=S{arr_number[2]}    

[root@localhost~]#    echo   $arr_index2

3

(3)数组遍历

[root@localhost~]#    vim   array_traverse.sh

#!/bin/bash

arr_number=(12345)

for v  in  ${arr_number[@]}

do

echo  Sv

done

[root@localhost~]#    chmod   +x   array_traverse.sh

[root@localhost~]#    ./array_traverse.sh

1

2

3

4

5

(4) 数组切片

[root@centos-7~]   #arr=(12345)

[root@centos-7~]  #echo   ${arr[@]}

12345

[root@centos-7~]   #echo    ${arr[@]:0:2}

12

[root@centos-7~]  #echo    ${arr[@]:2:3}

345

(5)数组替换

[root@centos-7~]   #arr=(12345)

[root@centos-7~]  #echo    ${arr[@]/4/66}

123665

[root@centos-7~]   #echo   ${arr[@]}

12345

[root@centos-7~]#    arr=(${arr[@]/4/66}) [root@centos-7~  ]#echo   ${arr[@]}

123665

(6)数组删除

[root@centos-7~]   #arr=(12345)

[root@centos-7~]   #unset   arr

[root@centos-7~]   #echo    ${arr[*]}

[root@centos-7~]  #arr=(12345)

[root@centos-7~]   #unset   arr[2]

[root@centos-7~]   #echo    ${arr[*]}

1245

Shell 脚本调试

在 Shell  脚本开发中,经常碰到一些规范方面的问题,例如忘了使用引号或在if 语句末 尾处忘记加fi 结束。要注意把复杂的脚本简单化,要思路清晰,并且分段实现。当执行脚本 时出现错误后,不要只看那些提示的错误行,而是要观察整个相关的代码段。

为避免编写的脚本出错,除了在编写脚本时注意书写规范,排除语法错误,更重要的是 利用调试脚本工具来调试脚本。echo  命令是最有用的调试脚本工具之一,一般在可能出现 问题的脚本中加入 echo  命令,采用的是分段排查的方式。

除 了echo 命令之外, bash Shell 也有相应参数可以调试脚本。使用 bash 命令参数调 试 , 命令的语法为 :

sh [-nvx] 脚本名

常用参数的具体含义为:

■  -n:    不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任 何内容,如果有问题会提示报错。

■  -V:   在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也 会给出错误提示。

■  -x:   将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。

当脚本文件较长时,可以使用 set   命令指定调试一段脚本。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值