从命令行覆盖bash脚本中的变量

时间:2011-01-05 22:04:16

标签: bash shell scripting

如何从命令行覆盖bash脚本中的变量?我知道如何传递变量,但我只想要./myscript.sh -Dvar=val

之类的东西

4 个答案:

答案 0 :(得分:50)

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

$ 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

答案 1 :(得分:11)

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

您可能希望查看内置bash的getopts命令。这为您提供了一种简单,灵活的方法来解析命令行参数并从命令行设置值。例如,我有四个变量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为空或未设置,请改为使用 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

答案 2 :(得分:10)

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

MYVAR=74 ./myscript.sh

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

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

答案 3 :(得分:0)

我会这样做:

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