Shell-Script

使用 shell 腳本執行具有多個參數的程序

  • January 7, 2018

我有一個 python 程序,我通過命令行(Mac OSX)執行它:

python -W ignore Experiment.py --iterations 10

該文件應使用不同的值Experiment.py多次執行。--iterations我一個接一個地手動完成,所以當一個執行完成時,我用 different 執行第二個--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怎麼辦?

您可以使用 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在進行下一個之前對 name 進行所有實驗,則可以將 name 循環設置為“外部”循環。

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

引用自:https://unix.stackexchange.com/questions/415004