版权声明:原创文章,转载请附加链接。 https://blog.csdn.net/qq_36749611/article/details/87463099
shell 条件测试和控制结构及shell函数
shell 条件测试
-
test测试命令
语法:test 表达式 -
测试文件属性
-b file:如果文件file存在且为块设备,则值为真
-c file:如果文件file存在且字符设备,则值为真
-r file:如果文件file存在且为只读,则值为真
-w file:如果文件file存在且可写入,则值为真
-x file:如果文件file存在且可执行,则值为真
-s file:如果文件file存在且长度大于0,则值为真
-d file:如果file是一个目录,则值为真
-f file:如果文件file是一个普通文件,则值为真
-e file:如果文件file存在,则值为真 -
测试数值
n1 -eq n2(等于)
n1 -ne n2(不等于)
n1 -gt n2(大于)
n1 -lt n2(小于)
n1 -ge n2(大于等于)
n1 -le n2(小于等于) -
测试字符串
-z s1判断长度是否为0,为0返回真
-z s1判断长度是否为0,不为0返回真
s1 !=s2,s1=s2 判断是否相等
s1 如果不是空串,返回真 -
测试逻辑运输符
-a 与
-o 或
!非
shell控制结构
- if结构
if 表达式
then 命令表
[else 命令表]
fi
1.fi表示if结束
2.命令表表示一条或若干条命令
3.elif可以理解为else if
- case结构
case 表达式 in
模式11[12]...) 命令表1;;
模式21[22]...) 命令表2;;
模式31[32]...) 命令表3;;
...
*)命令表n;;
esac
1.模式必须以)结尾
2.分支必须以;;结尾
3.*)表示缺省处理
4.esac表示case结束
5.模式中可以使用shell通配符,可以使用|(或关系)
- select结构
select 变量 in 列表
do
命令表
done
1.select结构是一种循环结构,需要使用break命令退出循环,也可以使用exit命令结束脚本
2.done表示循环结束
3.select通常与case语句一起使用
- while循环
while(表达式)
do
命令表
done
- for循环
for 变量 [in 列表]
do
命令表
done
1.for根据列表确定循环次数
2.for 变量 隐含表示 for 变量 $@
- until循环
until
命令表1
test 表达式
do
命令表2
done
1.直到型循环
2.命令表1在循环开始前执行,且在每一次循环结束后,再次执行
3.循环体为命令表2
- break和continue
- break语句可以结束while,for,until,select等结构执行,跳出循环,转到done语句后继续执行
- continue 结束本次循环中剩余代码,开始下一轮循环
shell函数
- 函数定义
[function] 函数名
{
命令表
[return]
}
- 关键字function表示定义一个函数,可以省略,其后是函数名,有时函数名后会有一对空括号,但非必须
{
表示函数开始,}
表示函数结束- return用于返回最后一个命令的退出状态或给定的参数值
- 使用exit退出整个脚本,函数退出后返回到调用该函数的地方
- 可以使用break语句中断函数执行
- 使用内部命令declare -f 可以显示定义的函数清单,declare -F只显示函数名
- 使用export -f 将函数输出给shell
- 使用unset -f 从shell内存中删除函数
- 函数的调用
- 函数执行前必须被定义
- 执行函数,输入函数名即可
- 使用命令定义的函数在用户注销时将自动删除,如果需要函数总是有效,可以将函数定义放在
~/.bash_profile
中。然后使用.或source执行.bash_profile文件,使其生效 - 函数通过位置变量传递参数,参数位置定义:$函数名 参数1 参数2 参数3 …
- 程序执行到return之后,函数就停止执行,返回到主程序执行,return返回0-256之间一个整数,返回值保存在变量$?中。可以给return指定返回值,没有指定时返回最后一个命令退出状态。
- 使用source命令或.命令可以把函数装入内存中。如:source 文件名
- 从内存中删除函数,语法:unset -f 函数名
- 函数作用域
- 全局作用域
没有使用关键字local进行特别的声明变量都具有全局作用域,可以在程序任何地方访问。 - 局部作用域
使用loal修饰即可,该类变量超出区域即被销毁 - 当全局变量与局部变量重名时,按就近原则处理
- 函数嵌套:在函数中定义并调用其他函数
- 函数递归:用自己的定义说明自己