web-dev-qa-db-ja.com

月の最初の月曜日かどうかをテストするBashスクリプト

少数のファイルを取得して、セットアップファイルの1つを処理するサイトにFTP用にセットアップするbashスクリプトがあります。私たちは他のファイルを毎月の最初の月曜日に表示するように探していますが、それをbashスクリプトにどのように入れるかわかりません。私はcrontabの使用に関するものを見てきましたが、スクリプトの最初の部分と最後の部分はまったく同じであり、2つの異なるスクリプトがある場合に問題を引き起こす可能性があります。

変更を加えることを検討しているスクリプトの一部のみを挿入します。

#!/bin/bash
...

e_file="/tmp/tmpemail.$(date +%s).txt"
file1='/usr/local/filename1'
file2='/usr/local/filename2'
relayserver='relay-server.example.com'

#ftp info
FTP_USER='ftpuser' #not the actual FTP User Name
FTP_DEST_PATH='/'

...

echo -e "Starting Tunnel and SFTP Process"
# make ssh tunnel for access to SFTP Site
ssh -L 9022:ftp.example.com:22 serviceaccount@$relay_server -Nf >/dev/null 2&>1
proc=`ps -ef | grep "ssh -L 9022\:ftp.example.com\:22" | awk '{print $2}'`

#checks to see if the tunnel opened correctly then proceeds to Push to FTP Site
if [ "${proc}" != "" ]; then

    #looking for first monday, was thinking of first day but the crontab only runs on monday to friday
    ifStart=`date '+%d'`
    if [ $ifStart == 01 ]; then 

        echo -e "File 1 & File2 sent to FTP Site" >> $e_file
            $SFTP_CMD -oPort=9022 -b /dev/stdin $FTP_USER@localhost << END
        cd $FTP_DEST_PATH
        put $file1
        put $file2
        bye
END

    else

        echo -e "file 2 sent to FTP" >> $e_file
            $SFTP_CMD -oPort=9022 -b /dev/stdin $FTP_USER@localhost << END
        cd $FTP_DEST_PATH
        put $file2
        bye
END

    fi

    echo "killing ssh tunnel - $proc"
    kill $proc

else

...

私がコメントしなければならない月の最初の月曜日のifステートメントを取得する正しい方向に向けられることを期待しています。これを回避するためのアイデアはありますか?

追加された注:このスクリプトは、処理されるファイルをアップロードするために毎月平日に実行する必要があります。

1
thebtm

すべてのスクリプトを読む時間はありませんが、ここにアイデアがあります。dateコマンドを使用して、曜日の名前を取得します。

we=$(LC_TIME=C date +%A)

LC_TIME=Cは、曜日の英語名を取得するために使用されます)

そして、その月の日を取得します

dm=$(date +%d)

次に、日が8未満で、曜日が月曜日であるかどうかを確認します。

if [ "$we" = "Monday" ] && [ "$dm" -lt 8 ]
then 
.....
fi
9
Romeo Ninov

問題のスクリプトをcrontabに入れます。

0 1 * * 1 [[ "$(/bin/date +\%d)" -le 7 ]] && /path/to/script.sh

毎週月曜日の0100に、日付が7番目以下かどうかを確認し、7番目以下の場合はスクリプトを実行します。

これを使用することのボーナスは、スクリプトを編集することなく、火曜日のスケジュールを非常に簡単に変更できることです。

3
DopeGhoti

毎週月曜日にcronでスクリプトを実行し、スクリプトに月の日が1〜7かどうかを確認させることができます。

このチェックは、メインスクリプトに統合することも、ラッパースクリプトを作成して、実行するためにメインスクリプトにこの変更を加える必要がないようにすることもできます。

if [[ $(date +%d) =~ 0[1-7] ]]; then
    : run script
fi

曜日と曜日の両方を確認する:

if [[ $(date +%w%d) =~ 10[1-7] ]]; then
    : run script
fi
2
Hauke Laging