Linux Shell函数需明确定义、传参校验、局部变量隔离、定义前置、区分return状态码与echo输出内容,确保可复用性。

在 Linux Shell 脚本中定义可复用的函数块,核心是把一段逻辑清晰、用途明确的命令序列封装起来,起个名字,需要时直接调用——不是为了炫技,而是让脚本更易读、好修改、少出错。
函数怎么写:两种写法都行,但别混用
Shell 支持两种等效语法,选一种坚持用到底就行:
-
带 function 关键字(语义更清楚,推荐新手):
function backup_log {
cp /var/log/syslog /backup/syslog.$(date +%F)
echo "Backup done."
} -
纯函数名加括号(更简洁,老脚本常见):
cleanup_temp() {
rm -f /tmp/*.tmp
echo "Temp files cleared."
}
注意:函数体必须紧跟在花括号后换行或空格,不能写成 func(){ 紧贴(某些旧 shell 会报错)。
让函数真正“可复用”:传参和局部变量很关键
光能调用不够,得能适应不同场景。比如查文件、处理不同路径、验证不同输入:
- 用
$1、$2… 接收参数,$#判断个数,避免误用:
safe_rm() {
if [ $# -ne 1 ]; then echo "Usage: safe_rm <file>"; return 2; fi
[ -f "$1" ] && rm -f "$1" && echo "Removed: $1" || echo "Not found: $1"
} - 用
local声明变量,防止和脚本其他部分冲突:
count_lines() {
local file="$1"
local count=$(wc -l /dev/null | awk '{print $1}')
echo "$count lines in $file"
}
调用函数前,必须确保它已定义
Shell 是逐行解释执行的,函数定义必须出现在调用之前。常见结构是:
- 顶部集中定义所有函数
- 中间写主逻辑,按需调用
- 不支持“先调用后定义”,也不像 Python 那样自动提升
如果函数较多,可拆到单独文件(如 lib.sh),用 source lib.sh 或 . lib.sh 加载,实现跨脚本复用。
返回结果要分清:状态码 vs 输出内容
这是最容易混淆的地方:
-
return N只设退出状态(0 表示成功,非 0 表示失败),用$?捕获;适合判断成败 -
echo "result"是向标准输出打印内容,用$(myfunc)捕获;适合取值 - 不要指望
result=$(myfunc); echo $result同时拿到 return 值和 echo 值——它们互不干扰
例如:
get_user_id() {
id=$(id -u "$1" 2>/dev/null)
if [ -n "$id" ]; then echo "$id"; return 0;
else return 1;
fi
}
uid=$(get_user_id alice)
if [ $? -eq 0 ]; then echo "UID is $uid"; fi


















