it-swarm-pt.tech

Passando variáveis ​​para um script bash ao fornecê-lo

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ê?

24

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 seu main.sh não ecoará nada porque os argumentos para o script de origem são ignorados e $1 fará referência ao argumento para main.sh.

Quando você origina o script em 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
20
Steven D

Eu vejo três erros:

  1. 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"
    
  2. Está faltando then; a linha condicional deve ser:

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

    . $HOME/install.sh "$NAME"
    
16
Michael Mrozek

basta definir seus parâmetros antes de obter 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 [ [email protected] ] as parametr(s) ";
exit;

teste

[email protected]$ ./main.sh some args
 i am sourced by [ main.sh ]
 with [ some args ] as parametr(s) 
[email protected]$
5
Jonah