Find last month name (199 Views)
Reply
Honored Contributor
Jeeshan
Posts: 2,084
Registered: ‎11-05-2007
Message 1 of 11 (199 Views)
Accepted Solution

Find last month name

Hi All

Help me to find put name of the last month.

i.e. Jan, Feb, Apr format
a warrior never quits
Please use plain text.
Honored Contributor
Jeeshan
Posts: 2,084
Registered: ‎11-05-2007
Message 2 of 11 (199 Views)

Re: Find last month name

Sorry, typo mistakes.

Please help me to find out the name of last month in shell script. (in POSIX)
a warrior never quits
Please use plain text.
Acclaimed Contributor
Dennis Handly
Posts: 24,888
Registered: ‎03-06-2006
Message 3 of 11 (199 Views)

Re: Find last month name

You could create an array an index into it:
set -A months Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
this_month=$(date +%m)
(( last_month = (this_month + (12-2)) % 12 ))
echo ${months[last_month]}
Please use plain text.
Acclaimed Contributor
James R. Ferguson
Posts: 21,184
Registered: ‎07-06-2000
Message 4 of 11 (199 Views)

Re: Find last month name

Hi:

If you simply want to display the current month name with 'date', simply do:

# echo "It is $(date '+%b')"

If you want to convert a numeric month value to the corresponding month name you could do something like this:

#. showmonth
#!/usr/bin/sh
MONTH=$1
[ -z "${MONTH}" ] && { echo "Month Number expected: '$MONTH'"; exit 1; }
MONTH=$(($MONTH-1))
set -A MONNAMES Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
echo ${MONNAMES[$MONTH]}

# ./showmonth 2
Feb

Regards!

...JRF...
Please use plain text.
Acclaimed Contributor
James R. Ferguson
Posts: 21,184
Registered: ‎07-06-2000
Message 5 of 11 (199 Views)

Re: Find last month name

Hi (again):

Aside from checking the range of valid input values (1-12) one small change to the example script I offered might help you.

If you use my original script, but pass the month number with a leading zero just as you might if you parsed it from a longer date, like '08/08/2010', your code would fail for August and September (months 8 and 9):

./showmonth 08
./showmonth[4]: 08-1: The specified number is not valid for this command.

The shell interprets numeric values with a leading zero (0) as octal numbers. Thus, values through '07' are valid, but a one like '08' isn't.

This is easily rectified using the 'typeset' declaration with '-LZ' to left-justify and remove leading zeros.

# cat ./showmonth
#!/usr/bin/sh
typeset -LZ MONTH=$1
[ -z "${MONTH}" ] && { echo "Month Number expected: '$MONTH'"; exit 1; }
MONTH=$(($MONTH-1))
set -A MONNAMES Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
echo ${MONNAMES[$MONTH]}

# ./showmonth 08
Aug

See the 'sh-posix' manpages for more information.

Regards!

...JRF...
Please use plain text.
Honored Contributor
Jeeshan
Posts: 2,084
Registered: ‎11-05-2007
Message 6 of 11 (199 Views)

Re: Find last month name

Dennis, good help

James, solution is good but not the exact one that I wanted.

I have a script which will purge the log files of the last month.
a warrior never quits
Please use plain text.
Acclaimed Contributor
Dennis Handly
Posts: 24,888
Registered: ‎03-06-2006
Message 7 of 11 (199 Views)

Re: Find last month name

[ Edited ]

>JRF: your code would fail for August and September (months 8 and 9):

I was thinking I might have a problem like that.

>The shell interprets numeric values with a leading zero as octal numbers.

This is broken, and C Standard is broken. A better language design to change the radix, should have used something explicit: 0o777

If you want the month names from the locale can do something like the following thread:

http://h30499.www3.hp.com/t5/Languages-and-Scripting/Get-last-months-month-in-alpha/m-p/5026703#U502...

Please use plain text.
Regular Advisor
Scott Lindstrom_2
Posts: 153
Registered: ‎06-02-2002
Message 8 of 11 (199 Views)

Re: Find last month name

I use the infamous caljd for this.

Knowing that 15 days ago is last month (especially when I run this on the first day of each month):

# caljd.sh -M -p 15 -o
Jan
Please use plain text.
Acclaimed Contributor
Dennis Handly
Posts: 24,888
Registered: ‎03-06-2006
Message 9 of 11 (199 Views)

Re: Find last month name

>JRF: your code would fail for August and September (months 8 and 9):

Yes, this fails for the Posix shell but not for ksh.
Please use plain text.
Acclaimed Contributor
James R. Ferguson
Posts: 21,184
Registered: ‎07-06-2000
Message 10 of 11 (199 Views)

Re: Find last month name

Hi (again):

And in keeping with your suggestion to internationalize, We could create an array of month names thusly:

# set -A MONNAMES $(locale -k abmon|sed -e 's/^abmon=//;s/"//g;s/;/ /g')

# MONTH=3;echo ${MONNAMES[${MONTH}-1]}
Mar

Regards!

...JRF...
Please use plain text.
Occasional Visitor
Bret_M_G
Posts: 1
Registered: ‎09-28-2012
Message 11 of 11 (174 Views)

Re: Find last month name

Just a thought.

curMon=$(date '+%b');
case ${curMon} in
        Jan ) prvMon="Dec" ;;
        Feb ) prvMon="Jan" ;;
        Mar ) prvMon="Feb" ;;
        Apr ) prvMon="Mar" ;;
        May ) prvMon="Apr" ;;
        Jun ) prvMon="May" ;;
        Jul ) prvMon="Jun" ;;
        Aug ) prvMon="Jul" ;;
        Sep ) prvMon="Aug" ;;
        Oct ) prvMon="Sep" ;;
        Nov ) prvMon="Oct" ;;
        Dec ) prvMon="Nov" ;;
esac

Couldn't help but play with the array version.

 

#!/usr/bin/ksh

set -A pMonths Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov ;

(( prvMonthNum=$(( $(date '+%m') - 1 ))  ));

prvMon=${pMonths[${prvMonthNum}]};




 

 

 

Please use plain text.
The opinions expressed above are the personal opinions of the authors, not of HP. By using this site, you accept the Terms of Use and Rules of Participation