bash中函数的调用、变量的定义、函数递归、信号

本文详细介绍了Bash中的函数,包括定义、调用、引用和返回值。讨论了变量作用域,区分了全局变量和局部变量。探讨了函数递归的实现,并讲解了如何在Bash中捕获和处理信号,特别是利用trap命令响应特定信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、函数

1.语法

方法1:
函数名() {
函数体
return n
}

方法2:
function 函数名() {
函数体
return n
}

2.调用函数

1)调用函数打印“l like westos”

#!/bin/bash
function fun1() {
    echo "l like westos"
}
fun1

2)

#!/bin/bash
function fun1() {
    echo "I am a boy~"
}
count=1
while [ $count -le 5 ]
do
    fun1
    count=$[ $count + 1 ]
done
echo "End of loop"
fun1
echo "End of script"

调试 sh -x +函数名

3.引用函数

#每次引用函数时,bash重新回到函数的定义

4.函数不一定要在最开始定义,但是如果函数在定义前就使用就会报错

1)

#!/bin/bash
count=1
echo "Before function definition"
function fun1() {
    echo "fun1"
}
while [ $count -le 5 ]
do
    fun1
    count=$[ $count + 1 ]
done
echo "End of loop"
fun2
function fun2() {
    echo "fun2"
}

如果没用定义函数就先使用 会出现报错
2)

#!/bin/bash
function fun1() {
    echo "first fun1"
}
fun1
function fun1() {
    echo "second fun1"
}
fun1
function fun1() {
    echo "third fun1"
}
echo "End"

5.函数名必须是唯一的,如果重新定义了函数,新的函数就会覆盖旧的函数 即每次接受的都是最新的值

6.返回值

1)默认退出状态码:默认情况下,函数的状态码时函数最后一条命令返回的退出状态码$?
就算前面的命令出错 只要最后一条命令是对的 函数的退出码就是对的
1)

#!/bin/bash
function fun1() {
    echo "trying to display a non-existent file"
    ls -l westosfile &> /dev/null
}
echo "test the function:"
fun1
echo "The exit status is : $?"

2)

#!/bin/bash
function fun1() {
    ls -l westosfile &> /dev/null
    echo "trying to display a non-existent file"
}
echo "test the function:"
fun1
echo "The exit status is : $?"

2)使用return命令
shell使用return命令来退出函数,并返回特定的退出状态

#!/bin/bash
function db1() {
    read -p "Enter a value:" value
    echo "doubling the value..."
    return $[ $value * 2 ]
}
db1
echo "The new value is $?"

返回值在0–255之间
这个的函数值不会保存到shell,即使后面继续写命令也没用

3)使用函数输出
将函数的输出保存在shell变量中,可以获得任何类型的函数输出并将其保存到变量中

4)函数中使用变量
可以向函数中传递参数 函数名会在$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义
$#来判断传给函数的参数项目

#!/bin/bash
#-1   $1 + $1  $1 + $2
function addem() {
}

5)函数不能直接从命令行获取脚本的参数
1)

#!/bin/bash
function fun1() {
    echo $[ $1 * $2 ]
}
if [ $# -eq 2 ];then
    value=`fun1 $1 $2`
    echo "The result is $value"
else
    echo "Usage:fun1 a b"
fi

二、变量的作用域

1)全局变量

任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以用

#!/bin/bash
function db1() {
    value=$[ $value * 2 ]
}
read -p "Enter a value:" value
db1
echo "The new value is:" $value

(函数外定义 函数内调用)

2)局部变量

定义方法:local value

#!/bin/bash
function fun1() {
    local temp=$[ $value + 5 ]
    result=$[ $temp * 2 ]
}
temp=4
value=6
fun1
echo "The result is $result"
if [ $temp -gt $value ];then
    echo "temp is larger"
else
    echo "temp is smaller"
fi

(local定义局部变量)

三、函数递归

计算阶乘

#!/bin/bash
read -p "请输入数字:"num
result=1
for i in `seq $num`
do
    result=$[ $result * $i ]
done
echo "The result is:" $result

上面是没有使用调用函数的代码,若要使用函数调用,则代码改为:

#!/bin/bash
read -p "请输入数字:" num
function fun() {
    result=$[ $result * $i ]
}
result=1
for i in `seq $num`
do
    fun
done
echo "The result is:" $result

换种思路

#!/bin/bash
function jc() {
    if [ $1 -eq 1 ];then
        echo 1
    else
        local temp=$[ $1 - 1 ]
        local result=`jc $temp`
        echo $[ $result * $1 ]
    fi
}
read -p "Enter a value:" value
result=`jc $value`
echo "The jc of $value is: $result"

四、信号

signal(前面有讲过)
linux通过信号来在运行系统上的进程之间通信
也可以通过信号来控制shell脚本的运行

1)捕捉信号

trap命令
#常用信号 ctrl+c(终止进程) ctrl+z(暂停进程)
阻挡:trap “echo westos” 2
取消:trap:2
查看:stty -a

#列出中断信号与键盘的关系 : stty -a

#信号屏蔽
trap “” 2 #把2信号置空
恢复:trap : 2
恢复方法2:trap - 2
trap “echo -n ‘You are typing ctrl+2’” 2

#!/bin/bash
trap "echo 'Sorry!I have trapped Ctrl+C'" 2
echo "This is a test script~"
count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep 2
    count=$[ $count + 1 ]
done
echo "This is the end of the script~"
trap - 2
echo "I just removed the trap"

2)捕捉脚本的退出

#!/bin/bash
trap "echo ByeBye~" EXIT
count=1
while [ $count -le 5 ]
do
    echo "Loop #$count"
    sleep 2
    count=$[ $count + 1 ]
done

xargs 获取前面命令的执行结果
-exec

cat test | xargs

按ctrl+c 删除文件westos
touch /tmp/westos_$(date +%F-%N)

练习:
先使用一个虚拟机当作跳板
使用被自动连接的两个虚拟机配钥匙,把钥匙分发给跳板机
使用另外一台测试机ssh跳板机
如果不是超级用户 给一个菜单:1)172.25.254.100 2)172.25.254.200 3)exit
查看uid是否为0 是0就是超级用户
定义一个屏蔽函数
先建立父进程:

cd /etc/profile.d
vim fu.sh
[ $UID -ne 0 ] && sh /mnt/tiaoban.sh

再建立子进程:

cd /mnt
vim tiaoban.sh
#!/bin/bash
function trapper() {
    trap "" INT EXIT TSTP TERM HUP
}
function main() {
    while true
do
    trapper
    clear
    read -p "请选择下列信息:
         1)172.25.250.218
         2)172.25.254.18
         3)exit
" num
case $num in
1)
echo "log in 172.25.254.218..."
ssh root@172.25.254.218
;;
2)
echo "log in 172.25.254.18..."
ssh root@172.25.254.18
;;
3)
exit
;;
esac
done
}
main
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值