web-dev-qa-db-fra.com

remplacer la variable dans le script bash à partir de la ligne de commande

Comment remplacer une variable dans votre script bash en ligne de commande? Je sais comment passer des variables, mais je veux juste quelque chose comme ./myscript.sh -Dvar=val

27
Derek

Vous devez utiliser le paramètre de développement pour la ou les variables que vous souhaitez remplacer:

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

Sans valeurs de dérogation

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

Avec des valeurs prioritaires

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

Bash n'est pas comme Make ou Ant. Ces deux programmes ne vous permettront pas de réinitialiser la valeur d'une macro/propriété une fois qu'elle est définie sur la ligne de commande. Dans BASH, vous devrez écrire vos scripts de manière à ce que vous puissiez définir ces valeurs à partir de la ligne de commande sans les remplacer par vos scripts.

Vous voudrez peut-être regarder la commande getopts qui est une commande intégrée de bash. Cela vous donne un moyen simple et flexible d’analyser les arguments de la ligne de commande et de définir des valeurs à partir de la ligne de commande. Par exemple, j'ai quatre variables OPT_A, OPT_B, OPT_C et OPT_D. Si je ne passe pas le paramètre, ils obtiennent leur valeur par défaut. Cependant, je peux remplacer cette valeur par défaut sur la ligne de commande:

 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

Vous pouvez également exporter vos variables d'environnement pour permettre à vos scripts BASH d'y accéder. De cette façon, vous pouvez définir une variable et utiliser cette valeur.

Dans BASH, la construction ${parameter:=Word} indique que si $parameter est défini, utilisez la valeur $parameter. Toutefois, si $parameter est null ou non défini, utilisez plutôt Word.

Maintenant, imaginez si vous faisiez ceci:

$ export COMMANDLINE_FOO="FUBAR"

Maintenant, la variable $ COMMANDLINE_FOO est définie et lisible par vos scripts Shell

Ensuite, dans votre script Shell, vous pouvez faire ceci:

FOO=BARFU

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

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

Cela va maintenant imprimer 

I'm using 'FUBAR' as the value

au lieu de

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

Vous devez spécifier la variable avec la syntaxe suivante:

MYVAR=74 ./myscript.sh

Dans le script, vérifiez s'il est déjà défini avant de le définir:

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

Je le ferais comme ça:

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