09 · 函数
目标:掌握函数定义、传参、返回值,理解
$?的坑
🎯 今天要带走的三件事
- 函数必须先定义后使用
return只能返回 0~255 整数,$?取返回值- 要返回字符串/大数 → 用
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 $?的输出差异
自测题
- 函数返回第 10 个参数,
$10写得对吗? return能返回字符串吗?- 为什么连续两次
echo $?结果可能不同?
👉 参考答案
1. 不对,要写 `${10}`。`$10` 被解析为 `$1` 后跟字符 `0`。 2. 不能。`return` 只能返回 0~255 的整数。返回字符串需用 `echo` 输出再由调用方 `$( )` 捕获。 3. 因为 `$?` 只反映**紧邻的上一条命令**。第一次 `echo $?` 读到的是函数返回值,而这次 echo 本身执行成功(退出码 0),所以第二次读到 0。🔗 关联
Shell-学习总览|上一课 → 08-流程控制|下一课 → 10-输入输出重定向