第三章、shell语法 函数 和 exit 命令
正文
第三章、shell语法 函数 和 exit 命令
函数
shell
中的函数和 c/c++
中的函数类似,但是在函数输出和返回值方面有些许的不同。
函数return
返回值: 函数返回的是 exit code
,可以通过 $?
变量获取。
函数输出: 函数中 echo
的字符查,在stdout
中,可以通过$(function_name 参数)
获取,或者是两个 `` 获取。
基本上函数返回的东西都用 echo 搞出来
函数返回值exit code
和输出output
函数定义
[function] function_name() { # function关键字可以省略 sentence1 sentence2 return exit_code # 不指定 exit_code 时候,默认为 0,可以直接写 return,或者是连 return 也不写 }
函数不获取 exit code 和 output
#! /bin/bash function test1() { if [ $1 -eq 0 ] then echo "\$1 == 0" return 0 else echo "\$1 != 0" return 155 fi } test1 2 echo $?
输出
$1 != 0 155
函数获取 exit code 和 output
#! /bin/bash function test1() { if [ $1 -eq 0 ] then echo "\$1 == 0" return 0 else echo "\$1 != 0" return 155 fi } output=$(test1 2) exit_code=$? echo "output=${output}" echo "exit_code=${exit_code}"
输出
output=$1 != 0 exit_code=155
函数参数
函数参数的传递
函数中 $0
表示文件名,注意是文件名,不是函数名
$1
、$2
这些仍是位置参数。
我们在上面的例子中,已经有过使用。
现在让我们递归计算 0 + 1 + 2 + ... + $1
首先想,需要使用 echo
,因为返回值只能是 0-255
function dfs() { if [ $1 -eq 0 ] then echo 0 return 0 else pre_output=$(dfs `expr $1 - 1`) echo "`expr ${pre_output} + $1`" return 0 fi } res=$(dfs 10) echo $res
输出
55
函数局部变量
局部变量 local_var
只可以用在函数中
#! /bin/bash function func() { local name='xyg' echo "inside ${name}" return 0 } func echo "outside ${name}"
输出
inside xyg outside
倘若不定义局部变量
#! /bin/bash function func() { name='xyg' echo "inside ${name}" return 0 } func echo "outside ${name}"
输出:
inside xyg outside xyg
注意和 export 区分,export全局变量是 子进程也可以使用!
exit 命令
之前函数,关键字return
是用于退出函数,并指定exit_code
默认为0。
在脚本bash
中存在关键字exit exit_code
,来退出当前shell进程,并返回一个退出状态;同样是使用$?
可以接收这个退出状态。
可以接受一个整数值(0-255)作为参数,代表退出状态。如果不指定,默认状态值是 0。所有的返回状态中,只有0
表示正常退出。
脚本事例
#! /bin/bash if [ $# -eq 3 ] # 位置参数数量 = 3,才是合法 then echo "legal arguments" exit 0 else echo "illegal arguments" exit 1 fi
输出
(base) xyg@vivo-xyg:~/xyg/test$ ./test.sh # 没有参数,illegal illegal arguments (base) xyg@vivo-xyg:~/xyg/test$ echo $? 1 (base) xyg@vivo-xyg:~/xyg/test$ ./test.sh 1 2 # 两个参数 illegal illegal arguments (base) xyg@vivo-xyg:~/xyg/test$ echo $? 1 (base) xyg@vivo-xyg:~/xyg/test$ ./test.sh 1 2 3 # 三个参数 legal legal arguments (base) xyg@vivo-xyg:~/xyg/test$ echo $? 0
参考文献
强烈推荐 Y总的基础课
linux教程-孟庆昌
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)