2010-03-24 5 views
1

Comment obtenez-vous le dernier jour du dernier mois dans csh?Recevez le dernier jour du dernier mois dans csh?

Voici le code jusqu'à présent. La commande cal ci-dessous fonctionne presque si vous l'exécutez à partir de la ligne de commande (FreeBSD sh), mais j'ai du mal à l'échapper correctement pour l'exécuter dans un script. Par le travail presque, je veux dire qu'il retourne 31, lorsque le dernier jour Février 2010 est 28.

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

Pour être clair:

  • Si aujourd'hui Mars 26 2010, elle devrait retourner le nombre 28, qui est le dernier jour du Février 2010.

  • Si aujourd'hui est le 1er Juillet 2010, il doit retourner le numéro 30, qui est le dernier jour de Juin 2010.

Mise à jour: réponse de travail reçue de Joshua Smith dans les commentaires ci-dessous: date -v31d -v-1m '+%d' Merci!

+0

est la seule csh shell que vous pouvez utiliser? – ghostdog74

+0

tcsh fonctionnera aussi – ANE

Répondre

1

Il suffit d'utiliser la commande Date:

date -v31d +'%a' 

vous donnera le nom de la date du dernier jour du mois en cours

pour le mois prochain :

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

Si vous voulez que le mois précédent:

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

- EDIT: intervenant a question sur GNU --- Date de

Si vous utilisez la date gnu (l'utilise date BSD ci-dessus), vous pouvez utiliser le - drapeau d. C'est un peu plus compliqué, cependant (la date de gnu ne fait pas la même chose avec le flou de longueur de mois). pour obtenir le dernier jour du mois pour le mois dernier

pour le mois en cours:

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

et pour le mois prochain

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

pour le mois dernier:

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

Cela me donne respectivement 03 et 04, dont aucun n'est le dernier jour de février 2010. – ANE

+1

c'est le mois% m Je l'ai changé pour donner le nom du jour. Vous pouvez voir la page man de strftime pour trouver les autres codes (pour la semaine, l'heure, etc.). –

+0

Ce serait 'date -v31d + '% d'' alors (sur ma boîte) – ChristopheD

0

Je pense (si je me souviens bien) que vous devez doubler les guillemets (``) quand vous les "emboîtez".

Essayer (non testé):

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

Cela me donne: "Invalid null command Mars 2010 Lu Ma Me Je Ve Sa 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

Etes-vous sur Solaris? Ce lien (http://adminschoice.com/solaris-error-messages-e-k#errno98) suggère qu'il est le résultat de l'utilisation de deux ou plusieurs tuyaux dans une rangée. J'essaierais de scinder la déclaration en deux parties en la redirigeant vers un fichier temporaire à moitié et en continuant ensuite la déclaration suivante à partir de là ... – ChristopheD

0

vous peut raccourcir votre commande pour omettre le grep/fmt. De plus, il n'est pas nécessaire de les entasser en une seule ligne.

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

par exemple

$ 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

Le dernier jour du dernier mois (février 2010) est le 28, mais cela me donne 31. – ANE

+0

non, ce n'est pas le cas. ça me donne 28 – ghostdog74

+0

Il retourne 31 dans csh sur FreeBSD, et 31 dans csh sur Linux. Vous n'êtes pas sûr de ce que vous utilisez? – ANE

Questions connexes