微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决有没有办法在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

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

##updates 按照我的建议,我做了以下

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

当我运行循环 3 次时,参数 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 的结束位置,您可以使用任何单词,但要确保 << 之后和参数末尾的那个是相同的。您还可以在 here-doc 中使用 bash 变量。

编辑:我没有像我应该的那样清楚。继承人应该在循环中进入脚本,而不是在 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”,则它们应该在您的脚本中的同一行中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。