web-dev-qa-db-fra.com

Passer des variables à un script de bash lors de l'approvisionnement

Supposons que j'ai dans Main.Sh:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

et en install.sh:

echo $1

Ceci est censé écho à "a string", mais ça écho rien. Pourquoi?

Michael Mrozek couvre la plupart des problèmes et ses correctifs fonctionneront depuis que vous utilisez Bash.

Vous êtes peut-être intéressé par le fait que la capacité de sourcler un script avec des arguments est un bashisme. Dans sh ou dash votre main.sh n'échoue rien parce que les arguments apportés au script source sont ignorés et $1 fera référence à l'argument à main.sh.

Lorsque vous recherchez le script dans sh, c'est comme si vous vous copiez et colla le texte du script source dans le fichier à partir duquel il a été source. Considérez ce qui suit (note, j'ai fait la correction Michael recommandé):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
20
Steven D

Je vois trois erreurs:

  1. Votre ligne d'affectation est fausse:

    $NAME="a string"
    

    Lorsque vous attribuez à une variable, vous n'incluez pas le $; ça devrait être:

    NAME="a string"
    
  2. Vous manquez then; La ligne conditionnelle devrait être:

    if [ -f $HOME/install.sh ]; then
    
  3. Vous ne citez pas $NAME, même s'il a des espaces. La ligne source devrait être:

    . $HOME/install.sh "$NAME"
    
16
Michael Mrozek

définissez simplement vos paramètres avant de rechercher le script!

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

installer.sh

#!/bin/bash
echo  " i am sourced by [ ${0##*/} ]";
echo  " with [ $@ ] as parametr(s) ";
exit;

test

u@h$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
u@h$
5
Jonah