【发布时间】:2017-11-17 22:47:11
【问题描述】:
在特别是 Bash 版本 4.0.0 中,有没有办法解决在启用 set -u 时使用空的 $@ 引发未绑定变量错误的问题?
考虑以下几点:
#!/usr/bin/env bash-4.0.0-1
set -xvu
echo "$BASH_VERSION"
echo "${BASH_VERSINFO[@]}"
main () {
printf '%q\n' "${@:-}"
}
main "${@:-}"
当我提供一组空参数时,给我以下输出:
neech@nicolaw.uk:~ $ ./test.sh
echo "$BASH_VERSION"
+ echo '4.0.0(1)-release'
4.0.0(1)-release
echo "${BASH_VERSINFO[@]}"
+ echo 4 0 0 1 release x86_64-unknown-linux-gnu
4 0 0 1 release x86_64-unknown-linux-gnu
main () {
printf '%q\n' "${@:-}"
}
main "${@:-}"
./test.sh: line 12: $@: unbound variable
我只在 Bash 版本 4.0.0 中看到这种行为。
我希望使用变量替换 ${@:-} 可以让我解决这个问题,但似乎没有。
有没有办法解决这个问题?
【问题讨论】:
-
您有什么重要的理由不简单地升级到
bash的新版本吗?此时 4.0.0 已经超过 8 年了,并且已经过时了四个版本;如果不是因为 macOS 坚持 3.2 的特殊情况,我认为有人会毫不犹豫地建议使用 至少 4.2,如果不是 4.3。 -
另一种解决方法是在您的脚本经过合理调试后关闭
set -u。如果您担心变量因简单拼写错误以外的原因而未设置,请在使用它们之前明确检查。 -
正如@chepner 所说,最好自己进行异常处理,而不是依赖 set -u。