Pasar variables a un script bash cuando se obtiene


18

Supongamos que tengo en main.sh:

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

y en install.sh:

echo $1

Se supone que esto tiene eco "a string", pero no hace eco de nada. ¿Por qué?


2
No actualice la pregunta por favor. De esta manera no podemos ver qué estuvo mal con su pregunta inicial. Lo acabo de enrollar.
Valentin Bajrami

Respuestas:


20

Michael Mrozek cubre la mayoría de los problemas y sus soluciones funcionarán ya que está utilizando Bash.

Puede interesarle el hecho de que la capacidad de generar un guión con argumentos es un bashismo. In sho dashyour main.shno reflejará nada porque los argumentos del script de origen se ignoran y $1se referirán al argumento paramain.sh.

Cuando ingresa la secuencia de comandos sh, es como si acabara de copiar y pegar el texto de la secuencia de comandos de origen en el archivo del que se obtuvo. Considere lo siguiente (nota, he hecho la corrección que Michael recomendó):

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

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

"En sh o dash, su main.sh no hará eco de nada porque se ignoran los argumentos del script de origen y $ 1 se referirá al argumento de main.sh" Eso es exactamente lo que está sucediendo. Gracias por responder.
Alguien todavía te usa MS-DOS el

Marqué su respuesta como aceptada, porque el problema real no era con errores en mi script, sino principalmente porque equiparaba sh con bash, y bash hace un mal trabajo al emular sh en esta situación. Su respuesta me iluminó sobre este tema, gracias;
Alguien todavía te usa MS-DOS

2
Técnicamente, es más un kshismo aquí (ya está allí en ksh86, probablemente antes). @ SomebodystillusesyouMS-DOS, la especificación "sh" no dice qué debería suceder si pasa argumentos adicionales, por lo que el comportamiento de guión o bash no es más "sh" que el otro y son igualmente válidos.
Stéphane Chazelas

16

Veo tres errores:

  1. Su línea de asignación es incorrecta:

    $NAME="a string"

    Cuando asigna a una variable, no incluye el $ ; debería ser:

    NAME="a string"
  2. Estás perdido then ; la línea condicional debería ser:

    if [ -f $HOME/install.sh ]; then
  3. No estás citando $NAME, a pesar de que tiene espacios. La línea de origen debe ser:

    . $HOME/install.sh "$NAME"

También tiene algunos otros errores, pero no creo que esa sea necesariamente la fuente del problema que plantea.
Steven D

@ Steven Tienes razón, había un par más que no mencioné; funciona para mí con las soluciones que he enumerado ahora
Michael Mrozek

@ Steven Cuando estaba juntando el script para probarlo, lo abrevié a [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME; Probablemente no debería hacer cosas así cuando estoy buscando errores
Michael Mrozek

Parece que el otro problema que pensé era que en realidad no es un problema, ya que menciona específicamente a BASH.
Steven D

5

¡simplemente configure sus parámetros antes de obtener el 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;

prueba

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

¿Cómo se configuran las banderas?
Jonathan Landrum

Editar: aparentemente solo los encadena después de los --argumentos de comando:set -- -v foo -l bar -j "${bin}"
Jonathan Landrum
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.