2010-03-24 2 views
1

Как вы получаете последний день последнего месяца в csh?Получите последний день последнего месяца в csh?

Код указан в настоящий момент. Команда cal ниже почти работает, если вы ее выполнили из командной строки (FreeBSD sh), но у меня возникли проблемы с ее безопасностью, чтобы запускаться внутри скрипта. Почти по работе, я имею в виду, что возвращает 31, когда последний день февраля 2010 года составляет 28

#!/bin/csh 
set lastdayoflastmonth=`cal `date '+%m'` `date '+%Y'` | grep . | fmt -1 | tail -1` 
echo $lastdayoflastmonth 

Чтобы было ясно:

  • Если сегодня 26 марта 2010, он должен вернуть номер 28, который является последним днем ​​февраля 2010 года

  • Если сегодня 1 июля 2010, он должен вернуть номер 30, который в последний день июня 2010 года

Обновление: рабочий ответ получен от Джошуа Смита в комментариях ниже: date -v31d -v-1m '+%d' Спасибо!

+0

является CSH только оболочка, которую Вы можете использовать? – ghostdog74

+0

tcsh тоже будет работать – ANE

ответ

1

Просто используйте команду Дата:

date -v31d +'%a' 

даст вам имя даты последнего дня текущего месяца

на следующий месяц :

date -v31d -v+1m +'%a' 

Если вы хотите предыдущий месяц:

date -v31d -v-1m +'%a' 

- EDIT: комментатор имеет вопрос о GNU Дате ---

Если вы используете Gnu дату (выше использует дату BSD), вы можете использовать - d флаг. Это немного сложнее, хотя (дата gnu не делает то же самое с неопределенностью длины месяца). чтобы в последний день месяца, за последний месяц

за текущий месяц:

date -d "$(date -d "next month" +%Y-%m-1) -1 day" +%a 

и на следующий месяц

date -d "$(date -d "2 months" +%Y-%m-1) -1 day" +%a 

за последний месяц:

date -d "$(date +%Y-%m-1) -1 day" +%a 
+0

Это дает мне 03 и 04 соответственно, ни один из которых не является последним днем ​​февраля 2010. – ANE

+1

Это месяц% m, я изменил его, чтобы дать имя дня. Вы можете увидеть страницу man для strftime, чтобы узнать другие коды (за неделю, час и т. Д.). –

+0

Это будет 'date -v31d + '% d'', тогда (на моем ящике) – ChristopheD

0

Я думаю (если я правильно помню), что вам нужно удвоить обратные (``), когда их «вложен».

Try (непроверенные):

set lastdayoflastmonth=`cal ``date '+%m'`` ``date '+%Y'`` | grep . | fmt -1 | tail -1` 
echo $lastdayoflastmonth 
+0

Это дает мне: «Недопустимая нулевая команда. март 2010 г. Вс Пн Вт Ср Чт Пт Сб 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 032010 « – ANE

+0

Вы на Solaris? Эта ссылка (http://adminschoice.com/solaris-error-messages-e-k#errno98) предполагает, что это результат использования двух или более труб подряд. Я бы попытался расщепить заявление в двух «частях», перенаправив его во временный файл наполовину, а затем продолжить в следующем утверждении оттуда ... – ChristopheD

0

вы может сократить вашу команду, чтобы опустить grep/fmt. Кроме того, нет необходимости втискивать их в одну строку.

set month=`date '+%m'` 
set year=`date '+%Y'` 
set lastdaymonth=`cal $month $year |tr -s " " "\n"|tail -1` 

например

$ tcsh 
$ set month="02" 
$ set year="2010" 
$ set lastdaymonth=`cal $month $year |tr -s " " "\n"|tail -1` 
$ echo $lastdaymonth 
28 
$ tcsh --version 
tcsh 6.17.00 (Astron) 2009-07-10 (i386-intel-linux) options wide,nls,dl,al,kan,rh,color,filec 
+0

Последний день последнего месяца (февраль 2010) - 28-е, но это дает мне 31. – ANE

+0

нет, это не так. он дает мне 28 – ghostdog74

+0

Он возвращает 31 в csh на FreeBSD и 31 в csh на Linux. Не знаете, что вы используете? – ANE

Смежные вопросы