Suponha que eu tenha no main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
e no install.sh:
echo $1
Isso deveria ecoar "a string"
, mas não ecoa nada. Por quê?
Suponha que eu tenha no main.sh:
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
e no install.sh:
echo $1
Isso deveria ecoar "a string"
, mas não ecoa nada. Por quê?
Respostas:
Michael Mrozek cobre a maioria dos problemas e suas correções funcionarão desde que você esteja usando o Bash.
Você pode estar interessado no fato de que a capacidade de originar um script com argumentos é um basismo. Em sh
ou dash
você main.sh
não ecoará nada porque os argumentos para o script de origem são ignorados e $1
se referem ao argumento paramain.sh.
Quando você origina o script sh
, é como se você apenas copiasse e colasse o texto do script de origem no arquivo do qual ele foi originado. Considere o seguinte (observe, eu fiz a correção que Michael recomendou):
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
Eu vejo três erros:
Sua linha de atribuição está errada:
$NAME="a string"
Quando você atribui a uma variável, você não inclui o $
; deveria ser:
NAME="a string"
Você está perdendo then
; a linha condicional deve ser:
if [ -f $HOME/install.sh ]; then
Você não está citando $NAME
, mesmo que tenha espaços. A linha de origem deve ser:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Provavelmente não deveria fazer coisas assim quando procuro erros
basta definir seus parâmetros antes de obter o 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$
--
argumentos de comando, exatamente como:set -- -v foo -l bar -j "${bin}"