Linux 用于运行命令的Bash脚本

Linux 用于运行命令的Bash脚本,linux,bash,shell,Linux,Bash,Shell,我试图编写一个Bash脚本来运行模拟并将输出文件保存在不同的目录中。到目前为止,我掌握的代码是: mainDirCfg="/home/software/simplesim/simplesim-3.0/sim-outorder -config ../$1" outFile="-redir:sim" declare -a benchmark=("bzip2_base.i386-m32-gcc42-nn dryer.jpg" "equake_base.pisa_little <inp.in>

我试图编写一个Bash脚本来运行模拟并将输出文件保存在不同的目录中。到目前为止,我掌握的代码是:

mainDirCfg="/home/software/simplesim/simplesim-3.0/sim-outorder -config ../$1"
outFile="-redir:sim"
declare -a benchmark=("bzip2_base.i386-m32-gcc42-nn dryer.jpg" "equake_base.pisa_little <inp.in> inp.out")
declare -a directory=("bzip2" "equake")
i=0
for d in "${directory[@]}"
do
  cd $d
  cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}"
  # above is the command to be run
  $cmdRun
  cd ..
  ((i++))
done
mainDirCfg=“/home/software/simplesim/simplesim-3.0/sim-outorder-config../$1”
outFile=“-redir:sim”
声明-a基准=(“bzip2_base.i386-m32-gcc42-nn dryer.jpg”“equalke_base.pisa_little inp.out”)
声明-a目录=(“bzip2”“equake”)
i=0
对于“${directory[@]}”中的d
做
cd$d
cmdRun=“$mainDirCfg$outFile$2${benchmark[$i]}”
#上面是要运行的命令
$cmdRun
光盘
((i++)
完成
上述脚本在第一次迭代中正确运行,而不是在第二次迭代中正确运行。但是,在命令提示符下单独运行命令时,我得到了预期的输出。我为第二次迭代运行的命令如下:

/home/software/simplesim/simplesim-3.0/sim-outorder -config ../tmp.cfg -redir:sim tmp9.out equake_base.pisa_little <inp.in> inp.out
/home/software/simplesim/simplesim-3.0/sim-outorder-config../tmp.cfg-redir:sim tmp9.out equalake\u base.pisa\u little inp.out
我不熟悉bash脚本。有人能指出问题出在哪里吗?谢谢。

换衣服

cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}"
$cmdRun

这是因为
${benchmark[1]}
中的重定向被视为命令参数,就像它们被引用一样,而不是真正的重定向。您的第二个程序不会终止,因为它会永远等待从stdin读取某些内容,而您必须键入这些内容,因为重定向不起作用(键入Ctrl-D关闭stdin,脚本将继续)

PS:记住这一点,应该避免改变

cmdRun="$mainDirCfg $outFile $2 ${benchmark[$i]}"
$cmdRun

这是因为
${benchmark[1]}
中的重定向被视为命令参数,就像它们被引用一样,而不是真正的重定向。您的第二个程序不会终止,因为它会永远等待从stdin读取某些内容,而您必须键入这些内容,因为重定向不起作用(键入Ctrl-D关闭stdin,脚本将继续)


PS:记住这一点,应该避免。

你在哪里/如何增加计数器(i)?第一个问题是你无法解释你的程序是如何失败的,第二个问题是你在没有通知的情况下更改了发布的脚本。对此我很抱歉。程序在第二次迭代中失败,因为它没有终止
$cmdRun
是它卡住的那一行。它怎么不工作?如果您认为模拟器调用不正确,请尝试将
$cmdRun
更改为类似
echo“$cmdRun”
的内容,以查看调用命令的实际内容。如果您的模拟器没有终止,则可能是您的模拟器或其调用方式有问题。您添加
cd..
的编辑很脆弱;如果您的目录列表类似于
(“tests/bzip2”“tests/equake”)
,则
是错误的。既然你说这是一个bash脚本,你应该(1)以
#开头/bin/bash
,和(2)然后使用bash内置的
pushd
popd
,在哪里/如何增加计数器(i)?第一个问题是你无法解释你的程序是如何失败的,第二个问题是你在没有通知的情况下更改了发布的脚本。对此我很抱歉。程序在第二次迭代中失败,因为它没有终止
$cmdRun
是它卡住的那一行。它怎么不工作?如果您认为模拟器调用不正确,请尝试将
$cmdRun
更改为类似
echo“$cmdRun”
的内容,以查看调用命令的实际内容。如果您的模拟器没有终止,则可能是您的模拟器或其调用方式有问题。您添加
cd..
的编辑很脆弱;如果您的目录列表类似于
(“tests/bzip2”“tests/equake”)
,则
是错误的。既然你说这是一个bash脚本,你应该(1)以
#开头/bin/bash
,(2)然后使用bash内置的
pushd
popd
。@titan请尽可能避免使用
eval
;如果您不完全理解bash语法(从这个问题来看,我保证您不理解bash语法),那么这将是一个巨大的bug磁铁。有了
eval
,一开始就可以很容易地做出一些有效的东西,但在稍有不同的情况下却会奇怪地失败PS@titan请尽可能避免使用
eval
;如果您不完全理解bash语法(从这个问题来看,我保证您不理解bash语法),那么这将是一个巨大的bug磁铁。有了
eval
,一开始就可以很容易地做出一些有效的东西,但在稍有不同的情况下却会奇怪地失败