【发布时间】:2011-06-04 07:48:35
【问题描述】:
如何从命令行覆盖 Bash 脚本中的变量?
我知道如何传递变量,但我只想要./myscript.sh -Dvar=val 之类的东西。
【问题讨论】:
如何从命令行覆盖 Bash 脚本中的变量?
我知道如何传递变量,但我只想要./myscript.sh -Dvar=val 之类的东西。
【问题讨论】:
您需要对要覆盖的变量使用参数扩展:
$ 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 呢?
您应该使用以下语法指定变量:
MYVAR=74 ./myscript.sh
在脚本中,设置前检查是否已经设置:
if [ ! -z $MYVAR ]; then
#do something
fi
【讨论】:
Bash 不像 Make 或 Ant。一旦在命令行上设置了宏/属性,这两个程序将不允许您重置它的值。相反,在 Bash 中,您必须以允许您从命令行设置这些值而不是在脚本中覆盖它们的方式编写脚本。
您可能想查看getopts 命令,它是 Bash 内置命令。这为您提供了一种简单、灵活的方式来解析命令行参数并从命令行设置值。例如,我有四个变量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 为 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
【讨论】:
我会这样做:
# if JAVA_HOME not set, then set with default value
if [ "x$JAVA_HOME" = "x" ]; then
JAVA_HOME=/opt/java
fi
【讨论】: