shell函数不能用return返回字符串,只能返回0–255状态码;须用echo或printf输出结果,再通过$()捕获。推荐printf防特殊字符截断,return仅用于表示成功或失败。

Shell函数不能直接用 return 返回字符串,它只能返回 0–255 的整数状态码;要向外传递字符串或运算结果,必须依靠 echo(或 printf)输出内容,再通过命令替换 $(...) 捕获。
用 echo 输出,调用方用 $() 捕获
这是最常用、最直接的方式。函数内部用 echo 打印结果,外部用 $(函数名) 获取输出。
- 函数体里不要用
return传值,return只用于表示成功(0)或失败(非0) -
echo的内容会原样输出到标准输出,被$()截取为字符串 - 注意避免多余的空格或换行:结尾加
-n可去掉换行,但通常保留换行更安全($()会自动裁掉尾部换行)
示例:
my_upper() {
echo "$1" | tr 'a-z' 'A-Z'
}
result=$(my_upper "hello")
echo "结果是:$result" # 输出:结果是:HELLO
支持多参数和简单运算的写法
函数可处理多个参数,并做基础计算或拼接,仍靠 echo 吐出最终结果。
- 算术运算可用
$((...)),然后echo输出数值 - 字符串拼接、截取、替换等都可在函数内完成,最后统一
echo - 避免在
echo前使用return中断输出逻辑
示例(两数相加):
add() {
echo $(($1 + $2))
}
sum=$(add 15 27)
echo "和是:$sum" # 输出:和是:42
注意子 shell 和变量作用域问题
用 $() 调用函数会启动子 shell,函数内用 local 声明的变量不影响父 shell,但 echo 输出不受影响。
- 函数内定义的
local变量不会“泄漏”,但echo是向 stdout 写,能被正确捕获 - 别在函数里试图用全局变量“传回”结果——不可靠,且破坏封装性
- 如果函数需要同时返回状态和字符串,建议用
echo传字符串,return传状态码(如 0 成功,1 失败)
替代方案:printf 更精准控制格式
printf 比 echo 更可靠(尤其含特殊字符时),推荐在需格式化或防意外截断时使用。
-
printf "%s" "$result"不加换行,printf "%s\n" "$result"显式换行 - 对含空格、星号、反斜杠等的字符串,
printf更安全 - 和
echo一样,配合$()使用即可
示例:
safe_echo() {
printf "%s" "$1"
}
val=$(safe_echo "a b * \$")
echo "[$val]" # 输出:[a b * $]











