【问题标题】:Is there a way to pass the parameters within the script in bash?有没有办法在 bash 中传递脚本中的参数?
【发布时间】:2021-07-15 15:14:33
【问题描述】:

我是 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

它询问我循环运行的次数,我需要它。有没有办法可以在脚本中传递这些参数并且脚本从那里读取它?我没有找到任何线索。任何帮助将不胜感激。

##updates 遵循 meisters 的建议,我做了以下操作

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

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

【问题讨论】:

  • 我认为您需要查看 abcinp 的来源 - 这就是错误。查看通过其代码的哪些路径会导致该错误消息以及它需要哪些参数以及采用什么格式。祝你好运 - 我认为你需要在电话中引用 LennardJones 和 Na。
  • 脚本正在运行,我需要输入那些要求的参数。我只是想知道脚本本身从文件或任何方式读取这些参数的方式。
  • 为什么不将./simcode.sh 包裹在一个箍本身中?这样,您每次需要时只需致电./simcode.sh 1.24 1。对于特定答案,您需要更全面地描述运行脚本 1 如何导致 ./simcode.sh 被调用 X 次。这样,答案可以告诉您如何将两个脚本联系在一起。

标签: bash bash-completion


【解决方案1】:

据我了解,该程序要求您输入这些参数,因为它不会将它们作为命令行参数读取。如果是这种情况,您可以尝试在您的 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 的结束位置,您可以使用任何单词,但请确保 &lt;&lt; 之后和参数末尾的那个是相同的。您还可以在 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 将打印“All done”。

注意:我假设 abcinp 要求输入一个参数,然后按 Enter 键,然后再要求输入另一个参数。如果您确实必须在同一行中键入“1.24 1”,则它们应该在脚本中的同一行中。

【讨论】:

  • 非常感谢。我尝试了第一个选项,参数仅用于第一次运行。我想将循环最多运行 30 次并获取参数 30 次。有什么建议吗?
  • 我不明白这一点“但请确保
  • 听起来文件的路径只适合第一次迭代。尝试更容易访问的路径,例如“~/fileWithArguments.txt”。如果它第一次起作用,则意味着您几乎拥有它。关于EOF部分,这意味着如果你写“
  • 我想通过1.24、1.0四次。现在,我只能跑一次。您能否使用 ANYWORD 编辑您的第二个答案类型,它的外观如何?
  • 您的两个建议都有效,但我需要它们的次数与循环运行的次数一样多。现在,它只给出循环中的第一次迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 1970-01-01
  • 2020-12-31
  • 2012-12-31
  • 2020-09-04
  • 2018-02-12
  • 2022-06-10
相关资源
最近更新 更多