Shell 函数实战手册:参数处理与返回值技巧全攻略
在 Shell 编程的世界里,函数是让脚本更模块化、更易维护的核心工具,而输入输出重定向则是高效处理数据流的关键技巧。无论是想把重复的代码封装成可复用的函数,还是想灵活地控制命令的输入输出,这两项技能都是每个 Shell 开发者的必修课。
本文将从函数的定义、传参与返回值入手,带你一步步掌握 Shell 函数的核心用法,再延伸到输入输出重定向的常用场景,用清晰的实例和解析,帮你把这些知识点真正落地到日常开发中。
shell函数
定义格式:
[ function ] funname [()]
{
action
[return int;]
}
参数说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
例如(定义了一个函数并进行调用):
1 #!/bin/bash
2 demoFun(){
3 echo "这是我的第一个shell函数"
4 }
5 echo "-------函数开始执行-------"
6 demoFun
7 echo "-------函数执行完毕-------"

例二(定义一个带有return语句的函数):
1 #!/bin/bash
2 funWithReturn(){
3 echo "这个函数会对输入的两个数字进行相加运算..."
4 echo "输入第一个数字: "
5 read aNum
6 echo "输入第二个数字:"
7 read anotherNum
8 echo "两个数字分别为 $aNum 和 $anotherNum !"
9 return $(($aNum+$anotherNum))
10 }
11 funWithReturn
12 echo "输入的两个数字之和为 $? !"

函数返回值在调用该函数后通过 $? 来获得
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可
函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
例如:
1 #!/bin/bash
2 funWithParam(){
3 echo "第一个参数为 $1 !"
4 echo "第二个参数为 $2 !"
5 echo "第十个参数为 $10 !"
6 echo "第十个参数为 ${10} !"
7 echo "第十一个参数为 ${11} !"
8 echo "参数总数有 $# 个!"
9 echo "作为一个字符串输出所有参数 $* !"
10 }
11 funWithParam 1 2 3 4 5 6 7 8 9 34 73

注意:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
其他特殊符号用来处理参数:
| 参数处理 | 说明 |
|---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程 ID 号 |
$! | 后台运行的最后一个进程的 ID 号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示 Shell 使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0 表示没有错误,其他任何值表明有错误 |
shell编程补充:
shell输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表:
| 命令 | 说明 |
|---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
重定向一般通过在命令间插入特定的符号来实现
例如:
command1 > file1
上面这个命令执行command1然后将输出的内容存入file1。 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。
实例(执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(bin):
$ who > bin

和输出重定向一样,Unix命令也可以从文件获取输入,
command1 < file1
注意:输出重定向是大于号,输入重定向是小于号
| 符号 | 名称 | 作用 |
|---|---|---|
< | 基本输入重定向 | 将「文件内容」作为命令的输入 |
<< | Here Document | 输入多行文本作为命令输入(无需文件) |
<<< | Here String | 输入单行字符串作为命令输入(更简洁) |
$ wc -l users
2 users
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
command1 < infile > outfile
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误
如果希望 stderr 重定向到 file,可以这样写:
$ command 2>file
如果希望 stderr 追加到 file 文件末尾,可以这样写:
$ command 2>>file
Shell 函数与重定向,看似是两个独立的知识点,但在实际场景中常常结合使用:你可以用函数封装业务逻辑,再通过重定向把函数的输出保存到日志文件,或者从配置文件中读取参数传递给函数。
希望通过本文的讲解,你不仅学会了函数的定义和传参,也掌握了重定向的实用技巧。这些基础工具就像积木,能帮你搭建出更健壮、更灵活的 Shell 脚本。
不妨现在就动手写一个结合函数与重定向的小脚本,比如用函数计算系统负载,再把结果追加到监控日志里,让今天学到的知识真正跑起来。









