0

たとえば、今日の日付の前の月曜日、火曜日、水曜日などを見つけることができる bash または ksh ルーチンを必死に見つけようとしています。さらに、プレーンなバニラ Solaris X で動作する必要があり、利用可能な GNU の日付がありません。

例: 今日 = 木曜日 2013/01/17 ; 最後の月曜日を見つけたいとしましょう。戻らなければならない: 2013/01/14

この特定のケースを除いて、すべての日で完全に機能するスクリプトをネット上で見つけることができました。結果として得られる最後の木曜日を見つけたい: 2013/01/10 ; 代わりに、今日の日付をもう一度取得します。

使用したスクリプトは次のとおりです。

#!/bin/ksh

#Get the nbr of the current weekday (1-7)
DATEWEEK=`date +"%u"`
#Which previous weekday will we need (1-7)
WEEKDAY=$1
# Main part
#Get current date
DAY=`date +"%d"`
MONTH=`date +"%m"`
YEAR=`date +"%Y"`
#Loop trough the dates in the past
COUNTER=0
if [[ $DATEWEEK -eq $WEEKDAY ]] ; then
# I need to do something special for the cases when I want to find the date of the same day last week
  DAYS_BACK=168
  DAY=`TZ=CST+$DAYS_BACK date +%d`
  echo "DAY (eq) = $DAY"
else
    while [[ $DATEWEEK -ne $WEEKDAY ]] ; do
       COUNTER=`expr $COUNTER + 1`
       echo "Counter is: $COUNTER"
       DAYS_BACK=`expr $COUNTER \* 24`
       echo "DAYS BACK is: $DAYS_BACK"
       DAY=`TZ=CST+$DAYS_BACK date +%d`
       echo "DAY is: $DAY"
        if [[ "$DAY" -eq 0 ]] ; then
         MONTH=`expr "$MONTH" - 1`
           if [[ "$MONTH" -eq 0 ]] ; then
            MONTH=12
           YEAR=`expr "$YEAR" - 1`
           fi
         fi
       DATEWEEK=`expr $DATEWEEK - 1`
     if [[ $DATEWEEK -eq 0 ]]; then
     DATEWEEK=7
     fi
done
fi
echo $DAY/$MONTH/$YEAR
4

2 に答える 2

0

(前回の提案が思い通りにいかなかった。昨夜遅くだった…)

重要なことは、今日を無視することですが、それでもループします。次のようにしてみてください。

#!/bin/ksh

#Get the nbr of the current weekday (1-7)
DATEWEEK=`date +"%u"`
#Which previous weekday will we need (1-7)
WEEKDAY=$1
# Main part
#Get current date
DAY=`date +"%d"`
MONTH=`date +"%m"`
YEAR=`date +"%Y"`
#Loop trough the dates in the past
COUNTER=0
while [ $COUNTER -eq 0 ] || [[ $DATEWEEK -ne $WEEKDAY ]] ; do
   COUNTER=`expr $COUNTER + 1`
   echo "Counter is: $COUNTER"
   DAYS_BACK=`expr $COUNTER \* 24`
   echo "DAYS BACK is: $DAYS_BACK"
   DAY=`TZ=CST+$DAYS_BACK date +%d`
   echo "DAY is: $DAY"
   if [[ "$DAY" -eq 0 ]] ; then
       MONTH=`expr "$MONTH" - 1`
       if [[ "$MONTH" -eq 0 ]] ; then
           MONTH=12
           YEAR=`expr "$YEAR" - 1`
       fi
   fi
   DATEWEEK=`expr $DATEWEEK - 1`
   if [[ $DATEWEEK -eq 0 ]]; then
       DATEWEEK=7
   fi
done
echo $DAY/$MONTH/$YEAR

あなたのDAY=`TZ=CST+$DAYS_BACK date +%d`トリックは私にはうまくいきません。Linux ではdate1 日で上限が設定されているようです。

于 2013-01-17T22:29:12.677 に答える
0

これは機能しますか?

today=$(date +"%u")
weekday=$1
curdate=$(date +"%s")
gobackdays=$(($today - $weekday))
if [ $gobackdays -le 0 ]; then
  let gobackdays+=7
fi
SECSDAY=86400
backtime=$(($curdate - $gobackdays * $SECSDAY))
echo $(date -d "@$backtime")
于 2013-01-18T11:16:36.380 に答える