Passando variáveis para um script bash ao fazer o sourcing

16

Suponha que eu tenha em main.sh:

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

e no install.sh:

echo $1

Isso deve ecoar "a string" , mas não faz eco de nada. Por quê?

    
por Somebody still uses you MS-DOS 20.12.2010 / 19:44

3 respostas

19

Michael Mrozek cobre a maioria dos problemas e suas correções funcionarão desde que você está usando o Bash.

Você pode estar interessado no fato de que a capacidade de criar um script com argumentos é um bashismo. Em sh ou dash , seu main.sh não ecoará nada porque os argumentos para o script de origem são ignorados e $1 se referirá ao argumento para main.sh.

Quando você fonte o script em sh , é como se você acabou de copiar e colou o texto do script de origem para o arquivo do qual foi originado. Considere o seguinte (note que fiz a correção que Michael recomendou):

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
    
por 20.12.2010 / 20:17
15

Eu vejo três erros:

  1. Sua linha de atribuição está errada:

    $NAME="a string"
    

    Quando você atribui a uma variável, não inclui o $ ; deveria ser:

    NAME="a string"
    
  2. Você está com falta de then ; a linha condicional deve ser:

    if [ -f $HOME/install.sh ]; then
    
  3. Você não está citando $NAME , mesmo que tenha espaços. A linha de origem deve ser:

    . $HOME/install.sh "$NAME"
    
por 20.12.2010 / 19:54
4

simplesmente defina seus parametrs antes de pesquisar o script!

main.sh

#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
    set -- $NAME ;
    . install.sh ;
fi
exit;

install.sh

#!/bin/bash
echo  " i am sourced by [ ${0##*/} ]";
echo  " with [ $@ ] as parametr(s) ";
exit;

teste

u@h$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
u@h$
    
por 20.05.2016 / 23:09