我正在尝试自动化物理应用程序的扫描过程。我的脚本是
#!/bin/bash
i=1
file="ATLASbins.txt"
while IFS= read line
do
scan=$line
cat test.sh | sed "s/ set vchi 5000/ set vchi $scan/g" > test2.sh
chmod +x test2.sh
bash -x /home/mario/Mine/test2.sh
i=$((i + 1))
done <"$file"
其中 test2.sh 是另一个脚本,我在其中启动进行扫描的应用程序。第二个脚本中的一个例子是
#!/bin/bash
/home/mario/mg5/bin/mg5_aMC
"import model Implementation"
"generate u++ > l+ l+"
output firstscript$i
set vchi 6500
launch firstscript$i
其中“导入模型”、“输出”和“启动”是应用程序的命令(在终端中运行)。
发生的事情是命令(在应用程序内部)不起作用,我得到像
PATH/test2.sh:第 5 行:导入模型实施:找不到命令
我不知道如何做到这一点(即编写一个可以将命令写入应用程序的脚本)并且尝试了各种不同的分隔符,在不同的 shell 中运行 test2 脚本并使用终端在新终端中调用它-侏儒。我怎样才能使这项工作?
另一个观察结果是我需要将 i 的变量值写入应用程序中。我试过这样写,例如,'output firstscript$i',我想即使命令有效,它也不起作用。
由于您将您的
test2.sh
作为单独的 shell 脚本运行,因此 shell 变量i
在其中不可用。这意味着脚本中的扩展$i
将为空。test2.sh
您可以通过两种方式解决此问题:在第一个脚本中
i
创建一个环境变量。export i
这很方便,但在一般情况下并不是一个很好的解决方案,因为其他脚本可能很想使用自己的i
变量,该变量可能独立于调用脚本中变量的任何值。调用脚本时
$i
在命令行上给出: . 这样就可以访问as (第一个命令行参数)中的值。test2.sh
test2.sh "$i"
$i
test2.sh
"$1"
第二个问题是您的
mg5_aMC
程序期望获得输入,即您在脚本中列出的命令。但是您输入这些的test2.sh
方式意味着它们将被视为shell 命令。脚本中没有将特殊控制命令传递给程序的任何内容。正如您从收到的错误中看到的那样,是 shell 抱怨找不到命令。它们不是 shell 命令,因此(当您知道如何解释事物时)这不足为奇。
假设您的
mg5_aMC
程序从标准输入读取,我不会为程序的每次运行编写一个 shell 脚本,而是为其提供一个输入控制/命令文件:在这里,文件
input-template.in
可能看起来像我选择使用
@thing@
我将用sed
shell 脚本中的调用替换的东西。这假定 的值不
$scan
包含会干扰sed
命令的字符(例如/
)。如果您的程序的控制脚本相当短,另一种方法是使用“here-document”将控制命令提供给您的程序:
here-document 基本上是一种对一段文本的重定向,它不是在文件中,而是在
<<TAG
和 结尾之间给出TAG
。文本中的变量(如果按上述方式编写)将由 shell 扩展,然后再输入您的命令。