【问题标题】:Work-around for $@ unbound variable in Bash 4.0.0?Bash 4.0.0 中 $@ 未绑定变量的解决方法?
【发布时间】: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。

标签: bash shell sh bash4


【解决方案1】:

$@$* 是特殊变量,因此应始终定义这是一个错误

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

一种解决方法,也许:

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

main "${args[@]}"

或者也可以

main "${@:+$@}"

【讨论】:

    【解决方案2】:

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

    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 
    

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 2012-06-11
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多