我想多次运行 python 文件并在每次运行时更改输入值。在本例中,输入值是一个网站地址和两个具有给定开始日期和给定结束日期的日期范围。
示例:
我想循环遍历并运行此文件,其中包含最多 12 个月前的不同日期。
文件
迭代 1,今天的日期和当月的第一天:
run -i 'file.py' 'https://www.example.com/' '2019-09-01' '2019-09-12'
迭代2,上个月的第一个日期和上个月的最后一个日期:
run -i 'file.py' 'https://www.example.com/' '2019-08-01' '2019-08-31'
迭代 3:
run -i 'file.py' 'https://www.example.com/' '2019-07-01' '2019-07-31'
...
继续迭代 12 个月前
我已经成功构建了一个 for 循环来生成日期,但我在合并 python 文件时遇到了麻烦。
for i in {1..12}; do
echo $(date -I -d "2019-09-01 -$i months")
done
输出:
2019-08-01
2019-07-01
2019-06-01
2019-05-01
2019-04-01
2019-03-01
2019-02-01
2019-01-01
2018-12-01
2018-11-01
2018-10-01
2018-09-01
您可以使用以下代码:
d1=$(date '+%Y-%m-01')
d2=$(date '+%Y-%m-%d')
for i in {1..12}; do
run -i 'file.py' 'https://www.example.com/' $d1 $d2
d2=$(date -d "$d1 -1 day" '+%Y-%m-%d')
d1=$(date -d "$d2" '+%Y-%m-01')
done
说明:
d1
开始,当月的当前日期作为 d2
。d2
(上个月的第一天)减去一天来推导出 d1
。将执行以下命令行:
run -i file.py 'https://www.example.com/' 2019-09-01 2019-09-12
run -i file.py 'https://www.example.com/' 2019-08-01 2019-08-31
run -i file.py 'https://www.example.com/' 2019-07-01 2019-07-31
run -i file.py 'https://www.example.com/' 2019-06-01 2019-06-30
run -i file.py 'https://www.example.com/' 2019-05-01 2019-05-31
run -i file.py 'https://www.example.com/' 2019-04-01 2019-04-30
run -i file.py 'https://www.example.com/' 2019-03-01 2019-03-31
run -i file.py 'https://www.example.com/' 2019-02-01 2019-02-28
run -i file.py 'https://www.example.com/' 2019-01-01 2019-01-31
run -i file.py 'https://www.example.com/' 2018-12-01 2018-12-31
run -i file.py 'https://www.example.com/' 2018-11-01 2018-11-30
run -i file.py 'https://www.example.com/' 2018-10-01 2018-10-31
你可以试试这个
run -i 'file.py' 'https://www.example.com/' '2019-09-01' '2019-09-12'
for i in {1..12}; do
run -i 'file.py' 'https://www.example.com/' '`echo $(date -I -d "2019-09-01 -$i months")`' '`echo $(date -I -d "2019-09-31 -$i months")`'
done
您可以使用反引号 (`) 来计算命令并替换命令的输出,就像您的情况一样,替换为日期。
更好的方法是从另一个脚本调用 python 脚本(假设您是编写第一个脚本的人)。
这是我的解决方案:
daysInThisMonth(){
d1=$(date '+%Y-%m-01')
d2=$(date '+%Y-%m-28')
d2=$(date -d "$d2 +5 day" '+%Y-%m')
d2=$d2-01
sec=$(( `date --date "$d2" +%s` - `date --date "$d1" +%s` ))
daysInMonth=$((sec / 24 / 60 / 60 ))
}