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

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

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

该变量的名称有任何约定/最佳实践吗?

答案1

REPLY通常用于此目的。它被readselect所使用bashksh并且zsh至少。

zsh文档中:

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

回复
与 REPLY 相同,但针对的是数组值而不是字符串。

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

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

get_date() {
  local date
  date=$(date)
  eval "$1=\$date"
}

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

function get_date {
  typeset -n var=$1
  var=$(date)
}

在 中ksh93,即使称为 也有效get_date var。有方法可以做到工作,并通过利用 的错误,但我不会去那里bash,因为该错误将来可能会被修复。mkshyashunset

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

相关内容