3

在具体的 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

我希望使用变量替换${@:-}可以让我解决这个问题,但似乎不是。

有没有办法解决这个问题?

4

2 回答 2

6

$@,$*是特殊变量,所以应该总是定义它是一个错误

https://unix.stackexchange.com/questions/16560/bash-su-unbound-variable-with-set-u

一种解决方法,也许:

set +u
args=("$@")
set -u

main "${args[@]}"

或者也许还有

main "${@:+$@}"
于 2017-06-15T12:51:29.623 回答
0

为什么不自己进行错误处理?通过这种方式,您可以准确控制遇到异常时发生的情况,例如返回自定义退出代码和该错误的消息,而不是局限于某些预定义的行为。

function log_error                                                          
{                                                                           
    [[ $# -ne 1 ]] && return 1                                              

    typeset msg="$1"                                                        
    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 
于 2018-06-09T07:47:10.177 回答