Bash 4.0.0 中 $@ 未绑定变量的解决方法?
Work-around for $@ unbound variable in Bash 4.0.0?
在 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
中看到此行为。
我希望使用变量替换 ${@:-}
可以解决这个问题,但似乎不行。
有办法解决这个问题吗?
$@
、$*
是特殊变量,因此应始终定义这是一个错误
https://unix.stackexchange.com/questions/16560/bash-su-unbound-variable-with-set-u
解决方法,可能是:
set +u
args=("$@")
set -u
main "${args[@]}"
或者也可能
main "${@:+$@}"
为什么不自己处理错误?通过这种方式,您可以准确控制遇到异常时发生的情况,例如 return 该错误的自定义退出代码和消息,而不是局限于某些预定义的行为。
function log_error
{
[[ $# -ne 1 ]] && return 1
typeset msg=""
typeset timestamp=$(date "+%F %T")
echo "[${timestamp}] [ERROR] - $msg " >&2
}
if [[ -z "$BASH_VERSION" ]]
then
log_error "BASH VERSION is not set"
exit 1
fi
在 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
中看到此行为。
我希望使用变量替换 ${@:-}
可以解决这个问题,但似乎不行。
有办法解决这个问题吗?
$@
、$*
是特殊变量,因此应始终定义这是一个错误
https://unix.stackexchange.com/questions/16560/bash-su-unbound-variable-with-set-u
解决方法,可能是:
set +u
args=("$@")
set -u
main "${args[@]}"
或者也可能
main "${@:+$@}"
为什么不自己处理错误?通过这种方式,您可以准确控制遇到异常时发生的情况,例如 return 该错误的自定义退出代码和消息,而不是局限于某些预定义的行为。
function log_error
{
[[ $# -ne 1 ]] && return 1
typeset msg=""
typeset timestamp=$(date "+%F %T")
echo "[${timestamp}] [ERROR] - $msg " >&2
}
if [[ -z "$BASH_VERSION" ]]
then
log_error "BASH VERSION is not set"
exit 1
fi