一、函数
1.语法
方法1:
函数名() {
函数体
return n
}
方法2:
function 函数名() {
函数体
return n
}
2.调用函数
3.引用函数
注意:每次引用函数时,bash会重新回到函数的定义
函数不一定要在最开始定义,但是如果函数在定义前就使用,会报错
函数名必须是唯一的,如果重新定义了函数,新的函数会覆盖旧的
4.返回值
1)默认退出状态码:默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码
2)使用return命令
shell使用return命令来退出函数并返回特定的退出状态码
3)使用函数输出
将函数的输出保存在shell变量中,可以获得任何类型的函数输出并将其保存到变量中
4)函数中使用变量
可以向函数中传递参数
函数名会再$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义
$#来判断传给函数的参数数目
练习:定义算法,当用户的输入不符合输入要求时,告诉用户具体用法,当输入正确时,计算乘积
5)函数不能直接从命令行获取脚本的参数值
二、变量的作用域
1)全局变量
整个脚本内均有效,即可在函数体内调用,也可在函数体外
注意:由于temp value在函数体外定义,是整体变量,所以在进行大小判断时,是调用函数后的值再进行比较,此时temp是11,所以显示temp大,这显然是不合理的,所在在函数体内,我们要加local value,指明它是局部变量,仅在函数体内生效,再次大小比较时,这次是全局变量temp4和value6比较,当然temp小了。
2)局部变量:定义方法:local value
三、函数递归
练习:用函数实现计算阶乘
四、信号
1)捕捉信号trap
列出中断信号与键盘的关系 stty -a
2)信号屏蔽,恢复
练习:写一个屏蔽ctrl+c的脚本
#!/bin/bash
trap "echo 'Sorry!I have trapped Ctrl+C'" 2 ##当按ctrl+c时,打印我已屏蔽此信号
echo "This is a test script"
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 2 ##等待2s
count=$[ $count + 1 ]
done
echo "This is the end of the script~"
trap - 2 ##恢复信号
echo "I just removed the trap"
3)捕捉脚本退出
练习:先自动建立文件,然后使用ctrl+c信号删除建立的文件
[root@localhost mnt]# cat touch.sh
#!/bin/bash
trap "find /tmp -type f -name "westos_*" | xargs rm -f && exit " 2 ##查找文件按信号2执行全部删除
while true
do
touch /tmp/westos_$(date +%F-%N-%M-%S) ##以时间为后缀建立文件
sleep 2
ls -l /tmp/westos*
done