shell 函数“返回”其结果的典型方法是将其分配给某个全局变量。
该变量的名称有任何约定/最佳实践吗?
答案1
REPLY
通常用于此目的。它被read
和select
所使用bash
,ksh
并且zsh
至少。
在zsh
文档中:
回复
此参数按惯例保留,用于在无法或不需要函数调用或重定向的情况下在 shell 脚本和 shell 内置命令之间传递字符串值。内置命令 read 和复杂命令 select 可以设置 REPLY,文件名生成在评估某些表达式时会设置并检查其值。一些模块也使用 REPLY 来实现类似目的。回复
与 REPLY 相同,但针对的是数组值而不是字符串。
不过,在更改该变量的类型时要注意潜在的影响。
另一种方法是将变量的名称作为参数传递:
get_date() {
local date
date=$(date)
eval "$1=\$date"
}
get_date
如果使用名为 的变量进行调用,则不起作用date
。ksh93
通过引入 namerefs 来解决这个问题,namerefs 是在调用者范围内引用变量的一种方式。bash
最近添加了 nameref 支持,但它们引用同一范围内的变量(仅按名称),因此对此没有用。
function get_date {
typeset -n var=$1
var=$(date)
}
在 中ksh93
,即使称为 也有效get_date var
。有方法可以做到工作,并通过利用 的错误,但我不会去那里bash
,因为该错误将来可能会被修复。mksh
yash
unset
另一种方法是不在函数中使用局部变量来设置除$1
, $2
... 位置参数之外的任意变量。但这可能会导致代码变得非常不可读。参见例如getopts_long
shell函数的实现。