it-roy-ru.com

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

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

27
Derek

Вам нужно использовать расширение параметров для переменных, которые вы хотите переопределить:

$ 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
48
SiegeX

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 установлена ​​и доступна для чтения в ваших сценариях оболочки

Затем в вашем сценарии 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
11
David W.

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

MYVAR=74 ./myscript.sh

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

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

Я бы сделал это так:

# if Java_HOME not set, then set with default value
if [ "x$Java_HOME" = "x" ]; then
    Java_HOME=/opt/Java
fi
0
lyuboe