Bash 无法在shell脚本中放入条件

Bash 无法在shell脚本中放入条件,bash,shell,sh,Bash,Shell,Sh,我不熟悉shell脚本 我一直在尝试创建一个在每个月底运行的shell脚本。但剧本不会在周日和周一播出。 只有星期二到星期六。所以如果月底在太阳或星期一,它将运行28或29。 如果一个月是30天,那么理想情况下脚本应该在30天运行。 但如果30号落在周日,那么剧本应该在29号播出 任何人都可以帮忙。尽管我非常同意这些评论,但我必须说我对一个好的挑战非常着迷。 我会使用一个包装器脚本,每天23:00或任何时候运行它。该包装器脚本只需确定作业应在当前月份的哪一天运行,然后如果当前日期正确,则实际运行

我不熟悉shell脚本 我一直在尝试创建一个在每个月底运行的shell脚本。但剧本不会在周日和周一播出。 只有星期二到星期六。所以如果月底在太阳或星期一,它将运行28或29。 如果一个月是30天,那么理想情况下脚本应该在30天运行。 但如果30号落在周日,那么剧本应该在29号播出


任何人都可以帮忙。

尽管我非常同意这些评论,但我必须说我对一个好的挑战非常着迷。 我会使用一个包装器脚本,每天23:00或任何时候运行它。该包装器脚本只需确定作业应在当前月份的哪一天运行,然后如果当前日期正确,则实际运行作业

诸如此类:

#!/bin/bash
#######################################################
#
# Script to determine if end of month job should run today
#
# datetorun.sh
#
# Usage : datetorun.sh
#
# version=1.0.0
# Andre Gelinas 2020
#######################################################

CurrentDate=( $(date +"%Y %m %d") )

####################
function MaxDayOfMonth
####################
# How many days per month. Parameter YYYY
{
typeset locYEAR
typeset locMONTH
typeset locMAX_DAY
typeset i

locYEAR=$1

for ((i=1;i<=12;i++)); do
        locMONTH=$i
        if [[ $locMONTH == @(1|3|5|7|8|10|12) ]]; then
                locMAX_DAY=31
        elif [[ $locMONTH == @(4|6|9|11) ]]; then
                locMAX_DAY=30
        elif [[ $locMONTH == "2" && ( $((locYEAR%4)) == 0 && ( $((locYEAR%100)) != 0  || $((locYEAR%400)) == 0 ) ) ]]; then
                locMAX_DAY=29
        else
                locMAX_DAY=28
        fi
        DAY_OF_THE_MONTH[$i]=$locMAX_DAY
done
}

######################
function DayOfWeek
######################
# This function returns the day of week where
# 0 = sunday, 1 = monday, ... 6 = saturday
# This algorithm is from Mike Keith's World of Words & Numbers:
# http://www.cadaeic.net/calendar.htm
# arguments: $1 = month, $2 = day, $3 = year in format YYYY
# [.] means to truncate downward to the nearest integer
# dayofweek=([23m/9] + d + 4 + y + [z/4] - [z/100] + [z/400] - 2 (if m >= 3)) mod 7
{
typeset -i locDOW
typeset -i z
typeset -i multpr

if [[ $1 -lt 3 ]]; then
# year determination
   z=$(($3-1))
else
   z=$3
fi
if [[ $1 -ge 3 ]]; then
# set the multiplier
   multpr=2
else
   multpr=0
fi

locDOW=$(( ((23 * $1/9) + $2 + 4 + $3 + ($z/4) - ($z/100) + ($z/400) - $multpr) % 7))

DOW=$locDOW
}

MaxDayOfMonth ${CurrentDate[0]}

DayOfWeek ${CurrentDate[1]} ${DAY_OF_THE_MONTH[${CurrentDate[1]}]} ${CurrentDate[0]}
# OR as per comments you can use this instead :
# DOW=$(date -d ${CurrentDate[0]}${CurrentDate[1]}${DAY_OF_THE_MONTH[${CurrentDate[1]}]} +"%w")

case $DOW in
    0)  DateToRun=$(( ${DAY_OF_THE_MONTH[${CurrentDate[1]}]}-1 ))
        ;;
    1)  DateToRun=$(( ${DAY_OF_THE_MONTH[${CurrentDate[1]}]}-2 ))
        ;;
    *)  DateToRun=${DAY_OF_THE_MONTH[${CurrentDate[1]}]}
        ;;
esac

if [[ $DateToRun -eq ${CurrentDate[2]} ]]; then
    echo "Running the script"
else
    echo "Not Running the script"
fi
#/bin/bash
#######################################################
#
#用于确定是否应在今天运行月末作业的脚本
#
#datetorun.sh
#
#用法:datetorun.sh
#
#版本=1.0.0
#安德烈·格里纳斯2020
#######################################################
CurrentDate=($(日期+%Y%m%d)))
####################
函数MaxDayOfMonth
####################
#一个月多少天。参数yyy
{
排版年份
每月排版
排版日期
i型
年份=$1

为了((i=1;我会这么说的,所以我们鼓励用户在他们的问题中以代码的形式发布他们的努力。因此,请在明确的示例输出/期望的同时添加相同的内容,然后让我们知道。你好,Anshika。我建议你阅读这篇关于如何在stackoverflow中提出好问题的帖子。你得到答案的机会将非常高更详细。例如,您可以在问题中添加如何安排脚本,如果您正在使用corn,crontab中的实际行是什么。您还应该指出您这样做是否严格为了学习,或者您是否试图为您的工作填满它。如果您的工作在受监管的行业,您还需要考虑跳过假期和其他一些可能性,它们都指向使用带有假日日历的数据库(必须每年维护)。请不要在评论中回复,但请更新您的问题,并留下您已更新问题的评论。祝您好运。为什么存在
DayOfWeek
方法?它似乎与
date+%w
一样。LOL…您是对的!忘了它。我喜欢这个函数,并且从发现它开始使用它。这是我的一个反射。