用于测试是否是该月第一个星期一的 Bash 脚本

用于测试是否是该月第一个星期一的 Bash 脚本

我有一个 bash 脚本,它获取一些文件并将它们设置为 FTP 到处理其中一个安装文件的站点。我们正在寻找办法让另一个文件在本月的第一个星期一上线,但我不知道如何将其放入 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

我没有时间阅读所有脚本,但想法如下:使用date命令获取一周中某一天的名称:

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

LC_TIME=C用于获取星期几的英文名称)

然后获取该月中的某一天

dm=$(date +%d)

然后检查该天是否小于 8 且星期几是星期一:

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

答案2

将有问题的脚本放入您的crontab

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

每个星期一 0100,它会检查日期是否小于或等于第七个,如果是,则运行脚本。

使用此功能的好处是可以很容易地重新安排周二的时间,而无需编辑脚本。

答案3

您可以让 cron 在每个星期一运行一个脚本,并让该脚本检查该月的日期是否为 1 到 7。

此检查可以集成到主脚本中,也可以编写包装脚本,这样您就不必对主脚本进行此更改即可运行。

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

检查星期几和月份:

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

相关内容