linux shell 函数可通过 echo 输出多值并用 read/ifs 解析、mapfile 读取多行、命名变量赋值或 return+echo 分工四种方式模拟多值返回,其中 echo+read 和 return 仅表状态是推荐实践。

Linux Shell 函数本身不支持像 Python 那样直接返回多个值(如 return a b c),但可以通过几种实用、稳定的方式“模拟”多值返回,并在调用端清晰获取多个结果。
用 echo 输出多字段,再用命令解析拆分
这是最常用、最兼容的方法:函数用 echo 一次性输出多个值(用空格、制表符或自定义分隔符分隔),调用方用 read 或 set -- 拆解。
- 函数内用
echo "val1 val2 val3"输出,确保字段间无空格干扰时可用空格;含空格内容建议改用\t或|分隔 - 调用时用
read a b c ,或更健壮的 <code>IFS='|' read -r x y z - 示例:
get_user_info() { echo "alice|30|admin" } IFS='|' read -r name age role
用数组变量接收多行输出
适合返回数量不定、每项独占一行的场景(如文件列表、匹配行)。
- 函数用多条
echo分别输出各值,调用方用mapfile或readarray读入数组 - 注意:
mapfile -t自动去除换行符,-t很关键 - 示例:
list_top3() { echo "/var/log" echo "/tmp" echo "/home" } mapfile -t paths
用命名变量或全局变量间接传值
适用于需返回复杂结构、或调用方明确知道变量名的场景(慎用,注意命名冲突)。
- 函数内直接给外部变量赋值,例如
result_code=0; result_msg="OK" - 调用前用
local声明同名变量可降低污染风险,但无法完全隔离(子 shell 中无效) - 更安全做法:约定前缀,如
myfunc_exit_code、myfunc_output_data
return 只管状态,echo 负责数据 —— 明确分工
这是 Shell 函数设计的最佳实践,不是缺陷,而是有意为之的职责分离:
-
return严格用于表示执行成功(0)或失败(1–255),供if myfunc; then ... fi判断 - 所有实际业务数据(字符串、数字、路径等)统一走
echo,由调用方用$(...)捕获 - 这样既保持语义清晰,又规避了
return的 0–255 限制和覆盖风险











