case分支选择结构:
case $VAR_NAME in
模式1)
分支1
;;
模式2)
分支2
;;
*)
默认分支
;;
esac
模式(PATTERN)
- 普通的文本字符
- 通配符 globbing
- |或
if多分支结构和case多分支结构的区别:
相同点:1.都是条件为真执行对应的分支语句,条件为假就都不执行
2.都可以设置默认分支结构,及所有条件都不匹配的时候执行的语句
不同点:
1.if是根据目录的执行状态返回值来判断正确与否,case是根据变量的值的取值内容是否匹配模式来判断的
2.case的每个分支都必须是由双分号结束的
while
while CONDITION ; do
循环体
done
进入循环的条件:CONDITION一直为真
退出循环的条件:CONDITION为假
until CONDITION ; do
循环体
done
进入循环的条件:CONDITION一直为假
退出循环的条件:CONDITION为真
注意:对于while和until两个循环结构来讲,如果要实施变量增量操作,必须手动给出
循环控制语句
continue
continue [n]
提前结束第n层循环,不在继续后续循环
无限循环用法
while true ; do
循环体
done
until false ; do
循环体
done
在此类循环结构中必须适当的使用continue和break,以保证循环不会一直持续下去
能够实现遍历功能的while循环
while read LINES ; do
循环体
done < /path/from/somefile
until ! read LINES ; do
循环体
done < /path/from/somefile
select
select NAME in LIST ; do
命令
done
select循环主要是用于创建一个菜单式列表,供用户选择
列表是按照数字顺序排列的,我们只要选择数字即可;在标准错误上输出
一般来讲,select与case一起使用
select是一个无限循环结构,必须在循环体重使用break命令退出循环,或者使用exit命令直接终止脚本运行
function ——函数
在shell脚本编程中,函数是由若干条shell命令组成的语句块,通常用于代码重装和模块化封装函数里面的内容和shell程序上是一致的 不同点就是shell代码可以直接被执行而函数中的内容,不能独立执行,只有被调用的时候才执行
函数是在shell程序的当前shell中运行
定义函数
函数是由两部分组成的:函数名称+函数体(能够实现独立功能的shell语句块)
语法1
function func_name{
函数体
}
语法2
func_name(){
函数体
}
注意:函数名与()之间不能加空白字符
注意:函数可以在交互式环境下定义,也可以在脚本中定义
函数的使用
函数在定义的时候,其函数体重包含的所有命令均不会被执行;只有函数被调用的时候再回执行其中的命令语句
调用方式:通过直接给出函数名称的方式调用
有很多的函数是存放于专门用于保存函数的文件中,如果想要调用这样的文件中保存的函数,使用source命令加载文件,然后再以直接给出函数名称的方式调用函数
使用set命令可以查看所有当前shell中生效的命令
使用unset命令可以撤销已经定义的函数
函数的执行结构的返回值:
- 在函数体中使用了echo或print命令输出的结果
- 在函数体中某些命令的输出结果
函数的状态返回值:
1.函数中最后一条命令的执行状态返回值
2.自定义退出状态码:
return [n] n:0-255 (1 2 127尽可能不使用)
注意:只要函数在执行时遇到了return命令,不管函数中的命令语句是否全部执行完成,立刻退出函数
函数的生命周期:
从被调用开始到遇到return命令或全部的语句执行完成为止;
函数的实参
在函数体中,可以使用$1 $2..位置变量为函数提供参数,还可以使用$*、[email protected]的方式引用所有位置参数;还可以使用$#计算为函数传递的参数个数
在调用函数的时候直接在函数名称后面以空白字符分隔多喝参数即可 func_name arg1 arg2...
传递给函数参数的位置参数,是调用函数的时候函数名称后面的以空白字符分隔的字符串序列;跟脚本的位置参数不一样
变量:
环境变量:当前shell及子shell
本地变量:当前shell
局部变量:定义在函数中的变量
local VAR_NAME
当前函数体
建议:手动撤销自己定义或声明的所有变量
函数的递归调用
在函数体中调用函数自身;
阶乘
调试脚本 bash -x /PATH/TO/SCRIPT_FILE