Linux Shell函数通过$1、$2等传参,用return返回0–255状态码($?获取),用echo输出数据并由$(...)捕获;二者互不干扰,可同时使用。
Linux Shell 函数不支持传统编程语言那种“返回数据”的方式,它向外传递信息靠两套独立机制:传参用 $1、$2…,返回则分“状态”和“数据”两种路径——一个走 return(存进 $?),一个走 echo(靠命令替换捕获)。
调用函数时紧跟的值,会按顺序变成函数内部的 $1、$2……
$1 表示第一个参数,$2 是第二个,以此类推;第 10 个及以上必须写成 ${10}、${11},否则会被当成 $10(即 $1 后跟字符 0)$# 给出参数总个数,$@ 把所有参数展开为独立字符串(推荐用于遍历),$* 则把全部参数拼成一个字符串(中间用空格连接)$1 就能取值,不需要声明形参,也不检查类型或个数——传错或少传,变量就为空,脚本不会报错,但逻辑可能出问题这是 Shell 函数最原生的“返回”,本质是退出状态,只能是 0–255 的整数,0 表示成功,非 0 表示失败。
return n 显式指定,比如 return 0 或 return 1
return 时,函数自动返回最后一条命令的退出状态(例如 ls /xxx 失败了,整个函数就返回非 0)$? 获取结果,且只能取一次——下一条命令执行后,$? 就被覆盖了Shell 函数不能直接“返回字符串或数字”,但可以用 echo 输出内容,再用 $(...) 捕获。
echo "hello" 或 echo $((a + b)) 输出你想传递的值result=$(myfunc arg1 arg2),result 变量就会存住 echo 的输出return 和 echo 互不干扰——你可以同时用:用 return 表达执行是否成功,用 echo 送出具体结果比如写一个安全取最大值的函数:
max_of_two() {if [ "$1" -gt "$2" ]; thenecho "$1"return 0elseecho "$2"return 0fi}val=$(max_of_two 15 8) echo "较大值是:$val" # 输出:较大值是:15 if [ $? -eq 0 ]; then # 注意:这里 $? 是 echo 的状态,不是函数 return 的!要立刻在 $(...) 后读 echo "取值成功" fi
真正想判断函数是否成功,得在调用后立刻查 $?,或者改用子 shell 方式隔离:
max_of_two() {[ "$1" -gt "$2" ] && { echo "$1"; return 0; } || { echo "$2"; return 0; }}result=$(max_of_two 15 8)ret_code=$?# 必须紧接上一行,否则被覆盖echo "$result, 状态码:$ret_code"