Załóżmy, że mam w main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
i w install.sh:
echo $1
Ma to odbijać się echem "a string"
, ale nic nie odbija. Dlaczego?
Załóżmy, że mam w main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
i w install.sh:
echo $1
Ma to odbijać się echem "a string"
, ale nic nie odbija. Dlaczego?
Odpowiedzi:
Michał Mrożek obejmuje większość problemów, a jego poprawki będą działać, ponieważ używasz Bash.
Być może interesuje Cię fakt, że możliwość źródłowego skryptu z argumentami to bzdura. W sh
lub dash
twoje main.sh
nic nie powtórzy, ponieważ argumenty skryptu źródłowego są ignorowane i $1
będą odnosić się do argumentumain.sh.
Kiedy dodajesz skrypt do źródła sh
, wygląda to tak, jakbyś po prostu skopiował i wkleił tekst źródłowego skryptu do pliku, z którego został pobrany. Rozważ następujące kwestie (uwaga, wprowadziłem poprawkę zalecaną przez Michaela):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Widzę trzy błędy:
Twoja linia przydziału jest nieprawidłowa:
$NAME="a string"
Kiedy przypisujesz do zmiennej, nie dołączasz $
; powinno być:
NAME="a string"
Brakuje ci then
; linia warunkowa powinna być:
if [ -f $HOME/install.sh ]; then
Nie cytujesz $NAME
, chociaż ma spacje. Linia źródłowa powinna być:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Prawdopodobnie nie powinienem robić takich rzeczy, kiedy szukam błędów
po prostu ustaw parametry przed pozyskaniem skryptu!
#!/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$
--
jak argumenty dowodzenia:set -- -v foo -l bar -j "${bin}"