使用 shell 脚本运行具有多个参数的程序

使用 shell 脚本运行具有多个参数的程序

我有一个 python 程序,我通过命令行(Mac OSX)运行它:

python -W ignore Experiment.py --iterations 10

该文件Experiment.py应使用不同的值运行多次--iterations。我一次又一次地手动执行此操作,因此当一次运行完成后,我会使用不同的 运行第二次运行--iterations,依此类推。然而,我不能总是靠近我的笔记本电脑来运行所有这些,所以我想知道是否有一种方法shell script可以一起声明所有运行,然后 shell 脚本一个接一个地执行它们(不是并行的,只是按顺序执行,就像我我会自己做吗)?就像是:

python -W ignore Experiment.py --iterations 10
python -W ignore Experiment.py --iterations 100
python -W ignore Experiment.py --iterations 1000
python -W ignore Experiment.py --iterations 10000
python -W ignore Experiment.py --iterations 100000

编辑: 如果我有多个参数怎么办--X --Y --Z

答案1

您可以使用 for 循环:

for iteration in 10 100 1000 10000 100000; do
    python -W ignore Experiment.py --iteration "${iteration}"
done

如果您有多个参数,并且想要所有参数的所有各种排列,如@Fox 在下面的评论中指出的那样,您可以使用嵌套循环。例如,假设您有一个--name参数,其值可以是n1n2n3,那么您可以执行以下操作:

for iteration in 10 100 1000 10000 100000; do
    for name in n1 n2 n3; do
         python -W -ignore Experiment.py --iteration "${iteration}" --name "${name}"
    done
done

例如,您可以将其放入文件中,runExperiment.sh并将其作为第一行:#!/bin/bash。然后您可以使用以下任一方法运行脚本:

bash runExperimen.sh

或者,您可以使脚本可执行,然后运行它:

chmod +x runExperiment.sh
./runExperiment.sh

如果您先对某些结果感兴趣,这将指导您如何构建循环。在上面的示例中,脚本将运行:

... --iteration 10 --name n1
... --iteration 10 --name n2
... --iteration 10 --name n3
... --iteration 100 --name n1

因此,它会运行第 10 次迭代的所有实验,然后再进行下一次迭代。相反,如果您希望n1在进行下一个实验之前对名称进行所有实验,则可以将名称循环设置为“外”循环。

for name in ...; do
    for iteration in ...; do

答案2

使用 GNU Parallel 时,它看起来像这样:

parallel -j1 python -W ignore Experiment.py --iterations {} ::: 10 100 1000 10000 100000

-j1如果您想Experiment.py为每个 CPU 核心并行运行一个,请删除该选项。

为了结合多个参数,我们假设您有:

-s = S, M, L
--size = small, medium, large
--color =  red, green, blue

您想要-s L链接到--size large但具有以下所有组合--color

parallel echo s={1} size={2} color={3} ::: S M L :::+ small medium large ::: red green blue

相关内容