有没有办法在bash中的脚本中传递参数?

Is there a way to pass the parameters within the script in bash?

我是 bash 的新手,正在尝试 运行 bash 中的以下命令。

name="Na"
for j in {1..3}
do
mkdir $j
cd $j
 ../../../../../abcinp "$name$j" 1 LennardJones 5.0 30 300 5 30 $j Na

cd ../
done

echo All done

在运行安装这个脚本后我需要输入以下参数

Parameters for atom 0: sigma epsilon >1.24, 1.0

它多次询问我循环 运行s,我需要它。有没有一种方法可以在脚本中传递这些参数,然后脚本从那里读取它?我还没有找到任何线索。任何帮助将不胜感激。

##更新 按照 meisters 的建议,我做了以下

#!/bin/bash
./simcode.sh << EOF
1.24 1
1.24 1
1.24 1

当我运行循环三次参数1.24 1只用于第一个运行。我如何为其他 运行 重定向它? simcode.sh 包含上面提到的原始脚本。

据我了解,该程序要求您输入这些参数,因为它不会将它们作为命令行参数读取。如果是这种情况,您可以尝试从文件中读取(但有更好的选择!)像这样在您的 script.sh:

#!/bin/bash
simulationProgram < fileWithArguments.txt

文件“fileWithArguments.txt”应该包含程序要求您键入的每个参数,每行一个,并按照程序要求它们的顺序。

关于更好的方法?使用heredoc,就像将文件放入文件中:

#!/bin/bash
simulationProgram << EOF
argument1
...
lastArgument
EOF

anotherCommands # If you need them

EOF 告诉 bash here-doc 在哪里结束,您可以使用任何单词,但要确保 << 之后和参数末尾的那个相同。您还可以在此处文档中使用 bash 变量。

编辑:我没有像我应该的那样清楚。 heredoc 应该放在循环的脚本中,而不是 bash 调用中。这是你的脚本应该是什么样子,假设每次你 运行 程序时它只要求 1.24 和 1(注意 1.24 和 1 在不同的行):

#!/bin/bash
name="Na"
for j in {1..3}
do
  mkdir $j
  cd $j
  ../../../../../abcinp "$name$j" 1 LennardJones 5.0 30 300 5 30 $j Na << EOF
1.24
1
EOF

  cd ../
done

echo "All done"

里面发生了什么:

  1. name 变量被初始化。
  2. 循环开始,j为1。
  3. 您创建了目录 $j(因此它将被称为“1”)
  4. 你去那个目录。
  5. 你启动 abcinp,我假设它会计算一个分子参数或其他东西(这个物理程序都有要求手动输入的恼人习惯),带有一系列参数。
  6. abcinp 启动,并要求手动输入。
  7. Bash 以“EOF”后的第一行回答手动输入:1.24.
  8. Bash 第二次要求手动输入,第二行(所以它会回答 1)。
  9. 然后程序停止询问参数并开始计算。完成后,您将移动到父目录并开始循环的下一次迭代。全部完成后,echo 将打印“全部完成”。

注意:我假设 abcinp 要求一个参数,然后您按回车键,然后要求另一个参数。如果您真的必须在同一行中键入“1.24 1”,那么它们应该在脚本中的同一行中。