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
Je vois trois erreurs:
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"
Vous manquez then
; La ligne conditionnelle devrait être:
if [ -f $HOME/install.sh ]; then
Vous ne citez pas $NAME
, même s'il a des espaces. La ligne source devrait être:
. $HOME/install.sh "$NAME"
définissez simplement vos paramètres avant de rechercher le script!
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$