如何从命令行覆盖bash脚本中的变量?我知道如何传递变量,但我只想要./myscript.sh -Dvar=val
答案 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_A
,OPT_B
,OPT_C
和OPT_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