it-swarm.com.de

überschreiben Sie die Variable im Bash-Skript von der Befehlszeile

Wie überschreiben Sie eine Variable in Ihrem Bash-Skript von der Befehlszeile aus? Ich weiß, wie man Variablen übergibt, aber ich möchte nur etwas wie ./myscript.sh -Dvar=val

27
Derek

Sie müssen die Parametererweiterung für die Variablen verwenden, die Sie überschreiben möchten:

$ 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"

Ohne Werte überschreiben

$ ./override.sh
var1 is foo | var2 is foo

Mit Überschreibungswerten

$ var1=bar var2=baz ./override.sh
var1 is bar | var2 is baz
48
SiegeX

Bash ist nicht wie Make oder Ant. Mit diesen beiden Programmen können Sie den Wert eines Makros/einer Eigenschaft nicht zurücksetzen, wenn er in der Befehlszeile festgelegt wurde. Stattdessen müssen Sie Ihre Skripts in BASH so schreiben, dass Sie diese Werte über die Befehlszeile festlegen und nicht in Ihren Skripts überschreiben können.

Vielleicht möchten Sie sich den Befehl getopts anschauen, der ein bash Builtin ist. Auf diese Weise können Sie auf einfache und flexible Weise Befehlszeilenargumente analysieren und Werte von der Befehlszeile aus festlegen. Zum Beispiel habe ich vier Variablen OPT_A, OPT_B, OPT_C und OPT_D. Wenn ich den Parameter nicht übergebe, erhalten sie ihren Standardwert. Ich kann diesen Standardwert jedoch in der Befehlszeile überschreiben:

 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

Sie können auch Ihre Umgebungsvariablen exportieren, damit Ihre BASH-Skripts auf sie zugreifen können. Auf diese Weise können Sie eine Variable festlegen und diesen Wert verwenden.

In BASH sagt das ${parameter:=Word}-Konstrukt, dass, wenn $parameter gesetzt ist, der Wert von $parameter verwendet wird. Wenn jedoch $parameter null oder unset ist, verwenden Sie stattdessen Word.

Nun stellen Sie sich vor, wenn Sie das getan haben:

$ export COMMANDLINE_FOO="FUBAR"

Nun ist die Variable $ COMMANDLINE_FOO für Ihre Shell-Skripte gesetzt und lesbar

Dann können Sie in Ihrem Shell-Skript Folgendes tun:

FOO=BARFU

[...]    #Somewhere later on in the program...

echo "I'm using '${COMMANDLINE_FOO:=$FOO}' as the value"

Dies wird jetzt gedruckt 

I'm using 'FUBAR' as the value

anstatt

I'm using 'BARFU' as the value
11
David W.

Sie sollten die Variable mit der folgenden Syntax angeben:

MYVAR=74 ./myscript.sh

Überprüfen Sie im Skript, ob es bereits festgelegt ist, bevor Sie es festlegen:

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

Ich würde es so machen:

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