在 Bash 脚本中以命令形式运行字符串

我有一个 Bash 脚本,它构建一个字符串作为命令运行

剧本:

#! /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

它似乎不能正确地向 $serverbin提供参数。

脚本输出:

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'

如果我只是粘贴命令 /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'(在“ running:”之后的输出中) ,它就可以正常工作。

511297 次浏览

我通常将命令放在圆括号 $(commandStr)中,如果这样做不能帮助我找到很好的 bash 调试模式,那么将脚本作为 bash -x script运行

不要把你的命令放在变量中,只是运行它

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'

可以使用 eval执行字符串:

eval $illcommando

./我铸造起 _ 死()

我一直在寻找类似这样的东西,但是我还需要重用相同的字符串减去两个参数,所以我得到了这样的结果:

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

这是我用来监视开放式堆栈热堆创建的东西。在这种情况下,我期望两个条件,操作“ CREATE”和状态“ COMPLETE”在名为“ Somestack”的堆栈上

为了得到这些变量,我可以这样做:

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

下面是我的 gradle 构建脚本,它执行存储在 异教徒中的字符串:

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

孤独的“)”有点丑陋,但我不知道如何修复这个美学方面。

要查看脚本正在执行的所有命令,请将 -x标志添加到您的 shabang 行,并正常执行该命令:

#! /bin/bash -x


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
$serverbin include="$include" server::team_l_start="${teamAComm}" server::team_r_start="${teamBComm}" CSVSaver::save='true' CSVSaver::filename='out.csv'


然后,如果有时想忽略调试输出,请将 stderr重定向到某处。

对我来说 echo XYZ_20200824.zip | grep -Eo '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}' 工作正常,但无法将命令输出存储到变量中。 我有同样的问题,我尝试 eval,但没有得到输出。

以下是我的问题的答案: cmd=$(echo XYZ_20200824.zip | grep -Eo '[[:digit:]]{4}[[:digit:]]{2}[[:digit:]]{2}')

echo $cmd

我的输出现在是 20200824