我在使用我的一个 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 在这里做得很好......