Supponiamo di avere in main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
e in install.sh:
echo $1
Questo dovrebbe echeggiare "a string", ma non riecheggia nulla. Perché?
Supponiamo di avere in main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
e in install.sh:
echo $1
Questo dovrebbe echeggiare "a string", ma non riecheggia nulla. Perché?
Risposte:
Michael Mrozek copre la maggior parte dei problemi e le sue correzioni funzioneranno da quando usi Bash.
Potresti essere interessato al fatto che la capacità di procurarsi una sceneggiatura con argomenti sia un bashismo. In sho la dashtua main.shvolontà non farà eco perché gli argomenti dello script di provenienza vengono ignorati e $1faranno riferimento all'argomentomain.sh.
Quando si genera lo script sh, è come se si copiasse e incollasse il testo dello script di origine nel file da cui era stato originato. Considera quanto segue (nota, ho apportato la correzione raccomandata da Michael):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Vedo tre errori:
La tua riga di assegnazione è errata:
$NAME="a string"
Quando si assegna a una variabile non si include il $; dovrebbe essere:
NAME="a string"Ti stai perdendo then; la linea condizionale dovrebbe essere:
if [ -f $HOME/install.sh ]; thenNon stai citando $NAME, anche se ha spazi. La linea di origine dovrebbe essere:
. $HOME/install.sh "$NAME"[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME; Probabilmente non dovrei fare cose del genere quando cerco errori
basta impostare i parametri prima di approvvigionare lo 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$
--proprio come fossero argomenti di comando:set -- -v foo -l bar -j "${bin}"