09 · 函数

2026.10.08 · 🟡

目标:掌握函数定义、传参、返回值,理解 $? 的坑

🎯 今天要带走的三件事

  1. 函数必须先定义后使用
  2. return 只能返回 0~255 整数,$? 取返回值
  3. 要返回字符串/大数 → 用 echo 输出 + $( ) 接收

一、函数定义

[ function ] funname [()]
{
    action;
    [return int;]
}

说明: - 可带 function 关键字也可不带 - return 可省略;省略时以最后一条命令的运行结果作为返回值 - return 后跟数值 n(0-255)

#!/bin/bash
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

⚠️ 所有函数必须在使用前定义,通常放在脚本开头。

二、返回值

funWithReturn(){
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

关键坑 ⭐: - return 只能返回 0~255 的整数,两数之和可能超范围 - $? 只对紧邻的上一条命令负责,一旦中间插了别的命令,返回值就丢了

demoFun1        # 返回 2
echo $?         # → 2 ✅
echo $?         # → 0 ❌(被上一条 echo 覆盖)

解法:需要返回大数或字符串时,用 echo 输出而非 return

funWithSum(){
    read aNum
    read anotherNum
    sum=$(($aNum + $anotherNum))
    echo $sum          # 用 echo 输出,外面用 $( ) 接收
}
result=$(funWithSum)
echo "和为 $result"

三、函数参数

函数内用 $n 获取参数,规则与脚本参数完全一致:

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第十个参数为 ${10} !"     # n≥10 必须用 ${n}
    echo "参数总数有 $# 个!"
    echo "作为字符串输出 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

⚠️ $10 不能取第十个参数,必须是 ${10}。

函数内可用的特殊变量(同脚本)

变量 含义
$# 参数个数
$* / $@ 所有参数
$$ 当前进程 ID
$! 后台最后进程 ID
$- Shell 当前选项
$? 上条命令退出状态

四、函数作为条件判断(易错)

Shell 中 0 代表 true,非 0 代表 false,与 C 相反:

function demoFun1(){ return 0; }
function demoFun2(){ return 12; }

if demoFun1; then echo true; else echo false; fi   # true  (返回 0)
if demoFun2; then echo true; else echo false; fi   # false (返回 12)

🌙 今日作业

  • [ ] 写一个函数,接收两个参数返回它们的和(用 echo 方式)
  • [ ] 观察连续两次 echo $? 的输出差异

自测题

  1. 函数返回第 10 个参数,$10 写得对吗?
  2. return 能返回字符串吗?
  3. 为什么连续两次 echo $? 结果可能不同?
👉 参考答案 1. 不对,要写 `${10}`。`$10` 被解析为 `$1` 后跟字符 `0`。 2. 不能。`return` 只能返回 0~255 的整数。返回字符串需用 `echo` 输出再由调用方 `$( )` 捕获。 3. 因为 `$?` 只反映**紧邻的上一条命令**。第一次 `echo $?` 读到的是函数返回值,而这次 echo 本身执行成功(退出码 0),所以第二次读到 0。

🔗 关联

Shell-学习总览|上一课 → 08-流程控制|下一课 → 10-输入输出重定向