保存函数结果的全局变量的名称是否有任何约定?

kjo*_*kjo 2 scripting bash zsh function

shell 函数“返回”其结果的典型方法是将其分配给某个全局变量。

此变量的名称是否有任何约定/最佳实践?

Sté*_*las 5

REPLY常用于此。它的使用readselectbashksh并且zsh至少。

zsh文档中:

REPLY
按照惯例保留此参数,以便在函数调用或重定向不可能或不可取的情况下,在 shell 脚本和 shell 内置程序之间传递字符串值。read 内置命令和 select 复杂命令可能会设置 REPLY,并且文件名生成在评估某些表达式时都会设置和检查其值。一些模块也出于类似目的使用 REPLY。

回复
作为回复,但用于数组值而不是字符串。

但是,在更改该变量的类型时要注意潜在的影响。

另一种方法是将变量的名称作为参数传递:

get_date() {
  local date
  date=$(date)
  eval "$1=\$date"
}
Run Code Online (Sandbox Code Playgroud)

如果get_date使用名为date. ksh93通过引入 namerefs 来解决这个问题,这是一种在调用者范围内引用变量的方法。bash最近添加了 nameref 支持,但它们引用同一范围内的变量(仅按名称),因此对此没有用。

function get_date {
  typeset -n var=$1
  var=$(date)
}
Run Code Online (Sandbox Code Playgroud)

在 中ksh93,即使称为 as 也能正常工作get_date var。有办法让它工作bashmkshyash通过利用的漏洞unset,但我不会去那里的错误可以固定在未来。

另一种方法是不在您的函数中使用局部变量来设置除$1, $2... 位置参数之外的任意变量。但是,这可能会导致非常不可读的代码。例如getopts_long参见shell 函数的实现