【问题标题】:Override a variable in a Bash script from the command line从命令行覆盖 Bash 脚本中的变量
【发布时间】:2011-06-04 07:48:35
【问题描述】:

如何从命令行覆盖 Bash 脚本中的变量?

我知道如何传递变量,但我只想要./myscript.sh -Dvar=val 之类的东西。

【问题讨论】:

    标签: bash shell scripting


    【解决方案1】:

    您需要对要覆盖的变量使用参数扩展:

    $ cat override.sh
    #!/bin/bash
    
    : ${var1:=foo} # var1 will take on the value "foo" if not overridden
    var2=${var2:-foo} # same thing but more typing
    
    echo "var1 is $var1 | var2 is $var2"
    

    没有覆盖值

    $ ./override.sh
    var1 is foo | var2 is foo
    

    具有覆盖值

    $ var1=bar var2=baz ./override.sh
    var1 is bar | var2 is baz
    

    【讨论】:

    • var1=bar var2=baz sudo ./override.sh 呢?
    【解决方案2】:

    您应该使用以下语法指定变量:

    MYVAR=74 ./myscript.sh
    

    在脚本中,设置前检查是否已经设置:

    if [ ! -z $MYVAR ]; then
        #do something
    fi
    

    【讨论】:

      【解决方案3】:

      Bash 不像 Make 或 Ant。一旦在命令行上设置了宏/属性,这两个程序将不允许您重置它的值。相反,在 Bash 中,您必须以允许您从命令行设置这些值而不是在脚本中覆盖它们的方式编写脚本。

      您可能想查看getopts 命令,它是 Bash 内置命令。这为您提供了一种简单、灵活的方式来解析命令行参数并从命令行设置值。例如,我有四个变量OPT_AOPT_BOPT_COPT_D。如果我不传递参数,它们将获得默认值。但是,我可以在命令行上覆盖该默认值:

       USAGE="$0 [-a <a> -b <b> -c <c> -d <d>]"
      
       OPT_A="Default Value of A"
       OPT_B="Default Value of B"
       OPT_C="Default Value of C"
       OPT_D="Default Value of D"
      
       while getopts ':a:b:c:d:' opt
       do
           case $opt in
               a) OPT_A=$OPTARG;;
               b) OPT_B=$OPTARG;;
               c) OPT_C=$OPTARG;;
               d) OPT_D=$OPTARG;;
              \?) echo "ERROR: Invalid option: $USAGE"
                  exit 1;;
           esac
      done
      

      您还可以导出环境变量以允许 Bash 脚本访问它们。这样,您可以设置一个变量并使用该值。

      在 Bash 中,${parameter:=word} 构造表示如果设置了$parameter,则使用$parameter 的值。但是,如果 $parameter 为 null 或未设置,请改用 word

      现在,想象一下如果你这样做:

      $ export COMMANDLINE_FOO="FUBAR"
      

      现在变量 $COMMANDLINE_FOO 已设置好并且可以供您的 shell 脚本读取。

      然后,在你的 shell 脚本中,你可以这样做:

      FOO=BARFU
      
      [...]    #Somewhere later on in the program...
      
      echo "I'm using '${COMMANDLINE_FOO:=$FOO}' as the value"
      

      现在将打印出来

      I'm using 'FUBAR' as the value
      

      而不是

      I'm using 'BARFU' as the value
      

      【讨论】:

      • 感谢您的解释,我也可能会使用它
      【解决方案4】:

      我会这样做:

      # if JAVA_HOME not set, then set with default value
      if [ "x$JAVA_HOME" = "x" ]; then
          JAVA_HOME=/opt/java
      fi
      

      【讨论】:

        猜你喜欢
        • 2014-08-19
        • 2015-04-24
        • 1970-01-01
        • 2012-10-30
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多