Подтвердить что ты не робот

Переопределить переменную в скрипте Bash из командной строки

Как переопределить переменную в вашем скрипте Bash из командной строки?

Я знаю, как передавать переменные, но я просто хочу что-то вроде ./myscript.sh -Dvar=val.

4b9b3361

Ответ 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

Ответ 2

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

Ответ 3

Вы должны указать переменную со следующим синтаксисом:

MYVAR=74 ./myscript.sh

Внутри script проверьте, установлено ли оно до его установки:

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

Ответ 4

Я бы сделал это следующим образом:

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