scripts script resueltos programas paso pasar parametros manejo hacer español ejercicios ejemplos como comando cadenas bash shell double-quotes salt-stack

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