Führen Sie einen String als Befehl in einem Bash-Skript
-
23-09-2019 - |
Frage
Ich habe ein Bash-Skript, das eine Zeichenfolge Lauf als Befehl
bautScript:
#! /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
, die nicht die Argumente scheinen richtig an den $serverbin
zu liefern.
Script Ausgabe:
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'
, wenn ich nur den Befehl /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'
einfügen (in der Ausgabe nach "runnning:"). Es funktioniert
Lösung
Sie können eval
verwenden, um eine Zeichenfolge auszuführen:
eval $illcommando
Andere Tipps
I der Regel Befehle in Klammern $(commandStr)
, wenn das ich bash Debug-Modus groß, führen Sie das Skript als bash -x script
your_command_string="..."
output=$(eval "$your_command_string")
echo "$output"
nicht Ihre Befehle in Variablen, nur um es ausführen
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'
./ mich Abgüsse raise_dead ()
Ich war auf der Suche nach so etwas wie diese, aber ich brauche auch die gleiche Zeichenfolge wiederzuverwenden minus zwei Parameter so endete ich mit etwas nach oben wie:
my_exe ()
{
mysql -sN -e "select $1 from heat.stack where heat.stack.name=\"$2\";"
}
Dies ist etwas, das ich verwende, um zu überwachen Openstack Wärme Stapel Schöpfung. In diesem Fall erwarte ich zwei Bedingungen, eine Aktion ‚Erstellen‘ und ein Zustand ‚COMPLETE‘ auf einem Stapel namens „Somestack“
Um diese Variablen bekommt ich etwas tun kann, wie:
ACTION=$(my_exe action Somestack)
STATUS=$(my_exe status Somestack)
if [[ "$ACTION" == "CREATE" ]] && [[ "$STATUS" == "COMPLETE" ]]
...
Hier ist mein gradle Build-Skript, das ausgeführt wird Strings gespeichert in Heredocs :
current_directory=$( realpath "." )
GENERATED=${current_directory}/"GENERATED"
build_gradle=$( realpath build.gradle )
## touch because .gitignore ignores this folder:
touch $GENERATED
COPY_BUILD_FILE=$( cat <<COPY_BUILD_FILE_HEREDOC
cp
$build_gradle
$GENERATED/build.gradle
COPY_BUILD_FILE_HEREDOC
)
$COPY_BUILD_FILE
GRADLE_COMMAND=$( cat <<GRADLE_COMMAND_HEREDOC
gradle run
--build-file
$GENERATED/build.gradle
--gradle-user-home
$GENERATED
--no-daemon
GRADLE_COMMAND_HEREDOC
)
$GRADLE_COMMAND
Der einsame „)“ sind ein bisschen hässlich. Aber ich habe keine Ahnung, wie man den ästhetischen Aspekt zu beheben.