Solaris: encontre o dia da última segunda-feira, terça-feira,… domingo por meio de shell script

3

Estou tentando desesperadamente encontrar uma rotina de bash ou ksh que me permita encontrar, por exemplo, a segunda-feira, terça, quarta-feira anterior ... anterior à data de hoje. Additonal ele tem que trabalhar no Solaris X simples e eu não tenho a data GNU disponível.

por exemplo: Hoje = quinta-feira, 2013/01/17; Digamos que eu queira encontrar a última segunda-feira. Tem que retornar: 2013/01/14

Eu consegui encontrar um script na rede que faz o trabalho perfeitamente para todos os dias, exceto neste caso específico: por exemplo: Hoje = quinta-feira, 2013/01/17; Eu quero achar a última quinta-feira que deveria dar como resultado: 2013/01/10; mas em vez disso, encontro a data de hoje novamente.

O script usado foi este:

#!/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
    
por David Thijs 17.01.2013 / 20:58

3 respostas

4

Eu faria:

perl -MPOSIX -le '
  @t=localtime;
  print strftime "%Y/%m/%d", 
    localtime time - 86400*(($t[6]-1+7-$ARGV[0])%7+1)' 4

(onde 4 acima é o dia da semana, 0 para domingo, 4 para quinta-feira)

perl é geralmente a opção mais segura para manipulação de data portátil.

    
por 17.01.2013 / 21:47
2

Shellscript + date não é a ferramenta mais adequada aqui. A resposta perl dada já é boa, embora eu prefira a explicitação do python:

import datetime, sys

today = datetime.date.today()
wd = today.weekday() # Mon == 0, Sun == 6
wd_wanted = int(sys.argv[1])

date_wanted = today - datetime.timedelta((wd-wd_wanted)%7 or 7)

O or 7 bit resolve a última segunda-feira quando hoje é problema de segunda-feira.

    
por 17.01.2013 / 22:15
0

Como as perguntas postadas solicitam uma resposta em ksh ou bash para o simples Solaris 'X', suponho que não esteja dentro das diretrizes, mas se você puder instalar o Tcl 8.5, você terá acesso ao poderoso comando clock para data / hora aritmética:

Invocando o tclsh ...

% set delta 7                                
7
% clock format [clock scan "now - $delta days"]
Fri Jan 11 00:00:00 EST 2013
    
por 18.01.2013 / 17:45