2014-01-21 3 views
1

Я новичок в Shell scripting.Сценарий оболочки, чтобы получить дату в Linux

Я хочу написать сценарий, чтобы получить произвольную дату от пользователя в формате YYYY: MM: DD и echo (показать) дату вторника и пятницы предыдущей недели.

Например, если я даю входную дату как 2013-12-11.
Выход должен быть

date1= 2013-12-06 
date2= 2013-12-10 

или

Input Дата, 2013-12-07

Выход

date1= 2013-12-03 
date2= 2013-12-06 
+0

Ваш ожидаемый результат ввода/вывода не кажется последовательным. Каково ваше определение _week_, т. Е. Когда начинается неделя с вами? – devnull

+1

Возможный дубликат [Как мне получить сценарий даты bash для возврата дня недели относительно не текущего времени?] (Http://stackoverflow.com/questions/9203747/how-do-i-get- the-bash-date-script-to-return-a-day-of-the-week-relative-to-a-non) – fedorqui

+0

Вторник и Пт. на прошлой неделе или последние Tue и Fri? – Alfe

ответ

1

Попробуйте следующее:

input=2013-12-11 
lastTues=$(date -d "$input -$(date -d "$input +5 days" +%u) days" +%Y-%m-%d) 
lastFri=$(date -d "$input -$(date -d "$input +2 days" +%u) days" +%Y-%m-%d) 

Эта команда сначала определяет количество дней между датой ввода и прошлым вторником (или пятницей), назовите это X. Затем он запускает date -d "inputDate -X days" для расчета новой даты.

1

Perl на помощь:

#!/usr/bin/perl 
use warnings; 
use strict; 

use DateTime; 

sub tuefri { 
    my ($year, $month, $day) = split /[^0-9]/, shift; 
    my $date = 'DateTime'->new(year => $year, 
           month => $month, 
           day => $day, 
          ); 
    $date->subtract(days => 7); 
    my @result; 
    until (2 == @result) { 
     push @result, $date->ymd if grep $_ == $date->day_of_week, 2, 5; 
     $date->add(days => 1); 
    } 
    return @result 
} 

my $i = 1; 
print 'date', $i++, "= $_\n" for tuefri(shift); 
0

решение с использованием python-dateutil модуля:

import fileinput 
from dateutil.relativedelta import TU, FR, relativedelta 
from datetime import date 

for line in fileinput.input(): 
    d = date(*(map(int, line.rstrip().split('-')))) 
    print(d + relativedelta(weekday=FR(-1))) 
    print(d + relativedelta(weekday=TU(-1))) 

Выполнить это нравится:

python script.py <<<"2013-12-11" 

Это дает:

2013-12-06 
2013-12-10 
Смежные вопросы