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 sh
o la dash
tua main.sh
volontà non farà eco perché gli argomenti dello script di provenienza vengono ignorati e $1
faranno 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 ]; then
Non 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}"