Supposons que j'aie dans main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
et dans install.sh:
echo $1
Ceci est censé faire écho "a string"
, mais il ne fait écho à rien. Pourquoi?
Supposons que j'aie dans main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
et dans install.sh:
echo $1
Ceci est censé faire écho "a string"
, mais il ne fait écho à rien. Pourquoi?
Réponses:
Michael Mrozek couvre la plupart des problèmes et ses correctifs fonctionneront puisque vous utilisez Bash.
Vous pouvez être intéressé par le fait que la possibilité de générer un script avec des arguments est un bashisme. Dans sh
ou dash
votre main.sh
ne fera écho à rien, car les arguments du script source sont ignorés et $1
feront référence à l'argumentmain.sh.
Lorsque vous sourcez le script sh
, c'est comme si vous venez de copier et coller le texte du script source dans le fichier à partir duquel il a été obtenu. Tenez compte des éléments suivants (notez que j'ai apporté la correction recommandée par Michael):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Je vois trois erreurs:
Votre ligne d'affectation est incorrecte:
$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 doit être:
if [ -f $HOME/install.sh ]; then
Vous ne citez pas $NAME
, même s'il contient des espaces. La ligne source doit être:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Je ne devrais probablement pas faire des choses comme ça quand je cherche des erreurs
définissez simplement vos paramètres avant de vous procurer 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$
--
comme ils étaient des arguments de commande:set -- -v foo -l bar -j "${bin}"