Как переопределить переменную в вашем скрипте 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
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
является нулевым или не установленным, используйте вместо него word
.
Теперь представьте, что вы сделали это:
$ export COMMANDLINE_FOO="FUBAR"
Теперь переменная $ COMMANDLINE_FOO установлена и доступна для чтения в ваших сценариях оболочки.
Затем в своем сценарии оболочки вы можете сделать это:
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
Вы должны указать переменную со следующим синтаксисом:
MYVAR=74 ./myscript.sh
Внутри script проверьте, установлено ли оно до его установки:
if [ ! -z $MYVAR ]; then
#do something
fi
Я бы сделал это следующим образом:
# if JAVA_HOME not set, then set with default value
if [ "x$JAVA_HOME" = "x" ]; then
JAVA_HOME=/opt/java
fi