Home > Software engineering >  How can I write a shell scripts that calls another script for each day starting from start date upto
How can I write a shell scripts that calls another script for each day starting from start date upto

Time:09-22

How can I write a shell scripts that calls another script for each day

i.e currently have

#!/bin/sh
./update.sh 2020 02 01
./update.sh 2020 02 02
./update.sh 2020 02 03

but I want to just specify start date (2020 02 01) and let is run update.sh for every day upto current date, but don't know how to manipulate date in shell script.

I made a stab at it, but rather messy, would prefer if it could process date itself.

#!/bin/bash
    for j in {4..9}
    do
       for k in {1..9}
       do
          echo "update.sh" 2020 0$j 0$k
          ./update.sh 2020 0$j 0$k
       done
    done

    for j in {10..12}
    do
       for k in {10..31}
       do
          echo "update.sh" 2020 $j $k
          ./update.sh 2020 $j $k
       done
    done

    for j in {1..9}
    do
       for k in {1..9}
       do
          echo "update.sh" 2021 0$j 0$k
          ./update.sh 2021 0$j 0$k
       done
    done

    for j in {1..9}
    do
       for k in {10..31}
       do
          echo "update.sh" 2021 0$j $k
          ./update.sh 2021 0$j $k
       done
    done

CodePudding user response:

You can use date to convert your input dates into seconds in order to compare. Also use date to add one day.

#!/bin/bash
start_date=$(date -I -d "$1")   # Input in format yyyy-mm-dd
end_date=$(date -I)             # Today in format yyyy-mm-dd

echo "Start: $start_date"
echo "Today: $end_date"

d=$start_date                    # In case you want start_date for later?
end_d=$(date -d "$end_date"  %s) # End date in seconds

while [ $(date -d "$d"  %s) -le $end_d ]; do # Check dates in seconds
    # Replace `echo` in the below with your command/script
    echo ${d//-/ }               # Output the date but replace - with [space]
    d=$(date -I -d "$d   1 day") # Next day
done

In this example, I use echo but replace this with the path to your update.sh. Sample output:

[user@server:~]$ ./dateloop.sh 2021-08-29
Start: 2021-08-29
End  : 2021-09-20
2021 08 29
2021 08 30
2021 08 31
2021 09 01
2021 09 02
2021 09 03
2021 09 04
2021 09 05
2021 09 06
2021 09 07
2021 09 08
2021 09 09
2021 09 10
2021 09 11
2021 09 12
2021 09 13
2021 09 14
2021 09 15
2021 09 16
2021 09 17
2021 09 18
2021 09 19
2021 09 20
  • Related