script - Llamar a un guión Bash desde otro guión pasando sus argumentos con comillas y espacios
scripts linux ejercicios resueltos (3)
Hice dos scripts de prueba bash en Linux para aclarar el problema.
TestScript1 se ve así: echo "TestScript1 Arguments:"
echo "$1"
echo "$2"
echo "$#"
./testscript2 $1 $2
TestScript2 se ve así:
echo "TestScript2 Arguments received from TestScript1:"
echo "$1"
echo "$2"
echo "$#"
Cuando ejecuto testscript1 de la siguiente manera:
./testscript1 "Firstname Lastname" [email protected]
El resultado deseado debe ser:
TestScript1 Arguments:
Firstname Lastname
[email protected]
2
TestScript2 Arguments received from TestScript1:
Firstname Lastname
[email protected]
2
Pero el resultado real es:
TestScript1 Arguments:
Firstname Lastname
[email protected]
2
TestScript2 Arguments received from TestScript1:
Firstname
Lastname
3
¿Cómo resuelvo este problema? Quiero obtener la salida deseada en lugar de la salida real.
Cita tus argumentos en Testscript 1:
echo "TestScript1 Arguments:"
echo "$1"
echo "$2"
echo "$#"
./testscript2 "$1" "$2"
Debe usar: "$@"
(CON las comillas) o "${@}"
(lo mismo, pero también indicando al shell donde comienza y termina el nombre de la variable).
(y NO use: $@
, o "$*"
, o $*
).
ex:
#testscript1:
echo "TestScript1 Arguments:"
for an_arg in "$@" ; do
echo "${an_arg}"
done
echo "nb of args: $#"
./testscript2 "$@" #invokes testscript2 with the same arguments we received
No estoy seguro de entender su otro requisito (¿desea invocar ''./testscript2'' entre comillas simples?) Así que aquí hay 2 conjeturas descabelladas (cambiando la última línea anterior):
''./testscript2'' "$@" #only makes sense if "/path/to/testscript2" containes spaces?
./testscript2 ''"some thing" "another"'' "$var" "$var2" #3 args to testscript2
Por favor, dame exactamente lo que intentas hacer
editar: después de su comentario diciendo que intenta tesscript1 "$ 1" "$ 2" "$ 3" "$ 4" "$ 5" "$ 6" para ejecutar: sal ''host remoto'' cmd.run ''./testscript2 $ 1 $ 2 $ 3 $ 4 $ 5 $ 6''
Tiene muchos niveles de intermedio: testcript1 en el host 1, necesita ejecutar "salt", y le da una cadena de ejecución de "testscrit2" con argumentos entre comillas ...
Podrías quizás "simplificar" teniendo:
#testscript1
#we receive args, we generate a custom script simulating ''testscript2 "$@"''
theargs="''$1''"
shift
for i in "$@" ; do
theargs="${theargs} ''$i''"
done
salt ''remote host'' cmd.run "./testscript2 ${theargs}"
si THAt no funciona, en lugar de ejecutar "testscript2 $ {theargs}", reemplace LA ÚLTIMA LÍNEA anterior por
echo "./testscript2 ${theargs}" >/tmp/runtestscript2.$$ #generate custom script locally ($$ is current pid in bash/sh/...)
scp /tmp/runtestscript2.$$ user@remotehost:/tmp/runtestscript2.$$ #copy it to remotehost
salt ''remotehost'' cmd.run "./runtestscript2.$$" #the args are inside the custom script!
ssh user@remotehost "rm /tmp/runtestscript2.$$" #delete the remote one
rm /tmp/runtestscript2.$$ #and the local one
Encontré que el siguiente programa funciona para mí
test1.sh
a=xxx
test2.sh $a
en test2.sh usa $1
para referir la variable a
en test1.sh
echo $ 1
La salida sería xxx