在 shell 脚本中格式化日期变量

Format date variable in shell script

我正在尝试获取本周最后一个星期一的月份编号。我得到它来检查它是星期几,如果不是星期一,则减去 x 天并将新日期设置为变量值。

我遇到的问题是将此变量格式化为仅获取月份。除了下面的倒数第二行外,一切正常。

startDate=$(date)
weekDayNum=$(date +'%u') # 1 is Monday

# If today is NOT Monday
if [ weekDayNum > 1 ];
then
    # Get the date for the last Monday
    newWeekDayNum=$(($weekDayNum-1))

    startDate=$(date -j -v-${newWeekDayNum}d)
fi

month=$(date -d "$startDate" +'%m')
echo $month```

使用expr将其转换为数字。

month=$(date -d "$startDate" +'%m')
month=$(expr $month + 0)
echo $month

输出:

8

[ weekDayNum > 1 ] 不测试数字顺序。使用 [ $weekDayNum -gt 10 ](您也没有访问 weekDayNum 变量的值)。

看来您必须在 dateBSD 变体中提供格式字符串:

这对我有用:

#!/usr/bin/env bash                                                                                                                                                                                                

LANG=C                                                                                                                                                                                                             
startDate=$(date)                                                                                                                                                                                                  
weekDayNum=$(date +'%u') # 1 is Monday                                                                                                                                                                             

# If today is NOT Monday                                                                                                                                                                                           
if [ $weekDayNum -gt 1 ];                                                                                                                                                                                          
then                                                                                                                                                                                                               
    startDate=$(date -j -v "-$(($weekDayNum - 1))d")                                                                                                                                                               
fi                                                                                                                                                                                                                 

month=$(date -j  -f "%a %b %d %T %Z %Y"  "${startDate}" +'%m')                                                                                                                                                     
echo $month