shell中函数的使用
函数是一个脚本代码块,你可以对它进行自定义命名,并且可以在脚本中任意位置使用这个函数。如果想要这个函数,只要调用这个函数的名称就可以了。使用函数的好处在于模块化以及代码可读性强。
(1).函数的创建语法
函数的创建方法一:
1 2 3 | function 函数名称 { 命令 } |
函数的创建方法二:
1 2 3 | 函数名称() { 命令 } |
注意:函数名称在当前脚本必须唯一。
调用函数的方法:
1 | 函数名称 参数1 参数2 ...... |
调用函数时可以传递参数,函数中使用$1、$2......来引用传递的参数。
(2).函数的使用实例
实例1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@youxi1 ~]# vim a.sh #!/bin/bash function fun1 { echo "hello world" } fun2() { echo $[$1+$2] } fun1 fun2 1 2 [root@youxi1 ~]# sh a.sh hello world 3 |
实例2:如果存在相同名称的函数,以最后一个为准
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@youxi1 ~]# vim b.sh #!/bin/bash function fun1 { echo "hello world" } fun1() { echo "This is rewrite" } fun1 [root@youxi1 ~]# sh b.sh This is rewrite |
(3).return返回值
使用return命令来退出函数并返回特定的退出码($?)
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@youxi1 ~]# vim c.sh #!/bin/bash fun1() { echo "return 3" return 3 echo "why?" } fun1 [root@youxi1 ~]# sh c.sh return 3 [root@youxi1 ~]# echo $? 3 |
注意:return一般是在函数的最后一行,因为一旦执行return命令,该函数后面的命令就不执行了。
return与exit的区别:return和exit都可以返回退出码,但是不同的是,return是退出函数,而exit是退出整个脚本。
(4).函数值赋给变量
如下方实例中显示,此时的函数就相当于一个命令,需要使用$()或``调用。
1 2 3 4 5 6 7 8 9 10 11 12 | [root@youxi1 ~]# vim d.sh #!/bin/bash fun1() { read -p "Input a number:" num echo $[num*5] } num2=`fun1` #也可以是$(fun1) echo $num2 [root@youxi1 ~]# sh d.sh Input a number:2 10 |
(5).外部参数传入函数
前面已经提到过,调用函数可以在后面跟随参数,函数内部可以使用$n的形式调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | [root@youxi1 ~]# vim e.sh #!/bin/bash fun1() { echo $1 } fun2() { echo $1 } fun3() { echo $1 } fun1 $1 fun2 /root/a.sh fun3 5 [root@youxi1 ~]# sh e.sh hello hello /root/a.sh 5 |
(6).函数的参数
在一个脚本当中,函数外的参数,函数可以直接调用,并且函数内的参数,只要运行过函数,外部也可以直接调用。
1 2 3 4 5 6 7 8 9 10 | [root@youxi1 ~]# vim f.sh #!/bin/bash num=5 fun1() { num2=$[num*10] } fun1 echo $num2 [root@youxi1 ~]# sh f.sh 50 |
注意:脚本内的参数仅限脚本内使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
2018-10-23 Linux命令之firewall-cmd