shell函数不能直接返回字符串,推荐用命令替换捕获echo或printf输出;也可用全局变量暂存或bash 4.3+的名称引用机制;return仅限0–255状态码。

Linux Shell 中的函数不能像高级语言那样直接“返回字符串”,但有几种可靠方式把字符串结果传出来,核心思路是:用命令替换捕获输出、用全局变量暂存、或通过参数传递引用。
用命令替换(推荐)
让函数 输出字符串到 stdout,调用时用 $() 或反引号捕获结果。这是最符合 POSIX 习惯、最安全的方式。
- 函数内部用
echo(或printf)打印要返回的字符串 - 调用时写成
result=$(myfunc),shell 会执行函数并把 stdout 内容赋给变量 - 注意避免多余的空格或换行,可用
printf '%s' "$str"精确控制
get_user_home() {
echo "$HOME"
}
home_dir=$(get_user_home)
echo "Home is: $home_dir" # 输出类似 Home is: /home/username
用全局变量暂存结果
定义一个约定好的全局变量(如 __result),函数内直接赋值,调用后读取它。适合需返回多个值或不便用 stdout 的场景。
- 提前声明变量(可选,但建议),如
declare __result - 函数内用
__result="xxx"赋值,不加local - 调用后立即使用该变量,注意并发或嵌套调用可能覆盖
parse_name() {
local full="$1"
__result="${full%%@*}" # 提取邮箱前缀
}
parse_name "alice@example.com"
echo "Username: $__result" # 输出 Username: alice
用名称引用(bash 4.3+,较灵活)
利用 declare -n 创建“变量的别名”,把结果直接写入调用方指定的变量名中。
- 函数接受一个变量名作为参数,如
func_name result_var - 函数内用
declare -n ref="$1"建立引用,再用ref="value"赋值 - 调用方传入变量名(不带
$),函数就能修改其值
build_path() {
declare -n out_ref="$1"
local base="$2"
local sub="$3"
out_ref="$base/$sub"
}
build_path mypath "/opt" "app"
echo "$mypath" # 输出 /opt/app
注意事项
避免常见坑:
- 不要在函数里用
return传字符串——return只能返回 0–255 的状态码 - 命令替换会自动去除尾部换行符,但保留开头和中间空白;如需原样保留,用
var=$(printf '%s' "$str")配合双引号引用 - 子 shell(如管道中的函数)里改全局变量无效,应避免
myfunc | cat这类用法











