shell 脚本:`set -u` 和 `$*`

shell 脚本:`set -u` 和 `$*`

我在使用我的一个 shell 脚本时发现了一个令人惊讶的行为。假设以下代码片段:

set -u
output()
{
    echo "$*"
}
output

我用 bash、ksh93、mksh、zsh、dash 和 pdksh 测试了这个片段。除 pdksh 之外的所有内容都按预期工作。

Pdksh 抱怨*: parameter not set.

嗯,pdksh(在某种程度上)是对的。没有参数output,因此$*未设置。

$*我通过替换为解决了这个问题${*:-}

  • pdksh 是正确的、过于挑剔的还是错误的?
  • 解决方法${*:-}有效吗?

由对 Schilys 答案的评论触发的更新:

  • 我在 Fedora 31 上,在某处找到了 pdksh,不是通过包管理器安装的
  • pdksh 版本@(#)PD KSH v5.2.14 99/07/13.2- 相当旧
  • 刚刚在测试脚本的可移植性时使用了 pdksh。

答案1

第一:$*反映$@当前参数(arg 向量),因此根据定义永远不会具有存在状态unset,因此set -u一定不会影响这些变量。

以前,更多的 shell 存在此类问题,并且您的${*:-}解决方法并不罕见。

pdksh已知存在错误,并且不再作为自己的项目进行积极维护,因此不要指望错误会得到修复。

mksh(来自 的 shell MirBSD)是一个固定且积极维护的变体,pdksh它是可移植的,因此可在许多平台上使用。 Thorsten Glaser 在这里做得很好......

相关内容