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é?
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é?
Respuestas:
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 sh
o dash
your main.sh
no reflejará nada porque los argumentos del script de origen se ignoran y $1
se 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
Veo tres errores:
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"
Estás perdido then
; la línea condicional debería ser:
if [ -f $HOME/install.sh ]; then
No estás citando $NAME
, a pesar de que tiene espacios. La línea de origen debe ser:
. $HOME/install.sh "$NAME"
[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME
; Probablemente no debería hacer cosas así cuando estoy buscando errores
¡simplemente configure sus parámetros antes de obtener el 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:set -- -v foo -l bar -j "${bin}"