scripts script resueltos programas programacion pasar parametros manejo espaƱol ejercicios ejemplos comandos comando cadenas bash shell command-line-arguments

bash - programas - scripts linux ejercicios resueltos



Ejecutar una cadena como un comando dentro de un script Bash (5)

./me arroja raise_dead ()

Estaba buscando algo como esto, pero también necesitaba reutilizar la misma cadena menos dos parámetros, así que terminé con algo como:

my_exe () { mysql -sN -e "select $1 from heat.stack where heat.stack.name=/"$2/";" }

Esto es algo que utilizo para monitorear la creación de la pila de calor de la pila abierta. En este caso, espero dos condiciones, una acción ''CREAR'' y un estado ''COMPLETO'' en una pila llamada "Somestack"

Para obtener esas variables, puedo hacer algo como:

ACTION=$(my_exe action Somestack) STATUS=$(my_exe status Somestack) if [[ "$ACTION" == "CREATE" ]] && [[ "$STATUS" == "COMPLETE" ]] ...

Tengo un script Bash que construye una cadena para ejecutar como un comando

Guión:

#! /bin/bash matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/" teamAComm="`pwd`/a.sh" teamBComm="`pwd`/b.sh" include="`pwd`/server_official.conf" serverbin=''/usr/local/bin/rcssserver'' cd $matchdir illcommando="$serverbin include=''$include'' server::team_l_start = ''${teamAComm}'' server::team_r_start = ''${teamBComm}'' CSVSaver::save=''true'' CSVSaver::filename = ''out.csv''" echo "running: $illcommando" # $illcommando > server-output.log 2> server-error.log $illcommando

que no parece suministrar los argumentos correctamente al $serverbin .

Salida de script:

running: /usr/local/bin/rcssserver include=''/home/joao/robocup/runner_workdir/server_official.conf'' server::team_l_start = ''/home/joao/robocup/runner_workdir/a.sh'' server::team_r_start = ''/home/joao/robocup/runner_workdir/b.sh'' CSVSaver::save=''true'' CSVSaver::filename = ''out.csv'' rcssserver-14.0.1 Copyright (C) 1995, 1996, 1997, 1998, 1999 Electrotechnical Laboratory. 2000 - 2009 RoboCup Soccer Simulator Maintenance Group. Usage: /usr/local/bin/rcssserver [[-[-]]namespace::option=value] [[-[-]][namespace::]help] [[-[-]]include=file] Options: help display generic help include=file parse the specified configuration file. Configuration files have the same format as the command line options. The configuration file specified will be parsed before all subsequent options. server::help display detailed help for the "server" module player::help display detailed help for the "player" module CSVSaver::help display detailed help for the "CSVSaver" module CSVSaver Options: CSVSaver::save=<on|off|true|false|1|0|> If save is on/true, then the saver will attempt to save the results to the database. Otherwise it will do nothing. current value: false CSVSaver::filename=''<STRING>'' The file to save the results to. If this file does not exist it will be created. If the file does exist, the results will be appended to the end. current value: ''out.csv''

si solo pego el comando /usr/local/bin/rcssserver include=''/home/joao/robocup/runner_workdir/server_official.conf'' server::team_l_start = ''/home/joao/robocup/runner_workdir/a.sh'' server::team_r_start = ''/home/joao/robocup/runner_workdir/b.sh'' CSVSaver::save=''true'' CSVSaver::filename = ''out.csv'' (en la salida después de "runnning:") funciona bien.


Normalmente $(commandStr) comandos entre paréntesis $(commandStr) , si eso no ayuda, encuentro que el modo de depuración de bash es excelente, ejecuto el script como script bash -x script


Puede usar eval para ejecutar una cadena:

eval $illcommando


no coloque sus comandos en variables, solo ejecútelo

matchdir="/home/joao/robocup/runner_workdir/matches/testmatch/" PWD=$(pwd) teamAComm="$PWD/a.sh" teamBComm="$PWD/b.sh" include="$PWD/server_official.conf" serverbin=''/usr/local/bin/rcssserver'' cd $matchdir $serverbin include=$include server::team_l_start = ${teamAComm} server::team_r_start=${teamBComm} CSVSaver::save=''true'' CSVSaver::filename = ''out.csv''


your_command_string="..." output=$(eval "$your_command_string") echo "$output"