Find the answer to your Linux question:
Results 1 to 5 of 5
I've got an array CALENDER=(31 28 31 30 31 30 31 31 30 31 30 31) I have two if statements that Need to get an index from the array ...
Enjoy an ad free experience by logging in. Not a member yet? Register.
  1. #1
    Linux Newbie
    Join Date
    Dec 2010
    Posts
    122

    Getting the correct index from an array


    I've got an array CALENDER=(31 28 31 30 31 30 31 31 30 31 30 31)

    I have two if statements that Need to get an index from the array above but when I feed a value into the brackets e.g. ${CALENDER[${SECONDDIGIT}]} or ${CALENDER[${FIRSTDIGIT}]} it seems to only be getting the first inded of the CALENDER array, 31, even though FIRSTVALUE will have a number from 1-9 in it and SECONDDIGIT will have 10, 11, or 12. Any ideas by I am unable to get the correct index with my FIRST and SECONDDIGIT values? Thanks.

  2. #2
    Linux User
    Join Date
    Dec 2011
    Location
    Turtle Island West
    Posts
    372
    You don't need to go
    Code:
    ${CALENDER[${SECONDDIGIT}]}
    You can just go
    Code:
    n=1; d=${CALENDER[n]}
    Which will return d=28 according to the array you presented. And don't forget leap years.

    But enough of that. I'm assuming you're scripting in bash, and it would *really* help to show a code snippet so I can tell what you're trying to do and where you're going wrong. You have 2 variables, d1 and d2. d1 is 1-9 and d2 is 10-12. Fine. This array has 12 elements, but is numbered 0-11. That's how arrays work. It would seem you need to go 0-8 and 9-11 to index this array properly.

    But, again, I'm assuming far too much.

    Peace and cheer.

  3. #3
    Linux Newbie
    Join Date
    Dec 2010
    Posts
    122
    Below is the whole script. And yes, I have accounted for leap year. Thanks.

    Code:
    #! /bin/bash -x
    
    
    # This is the calender array for the DateValidation program
    CALENDER=(31 28 31 30 31 30 31 31 30 31 30 31)
    
    
    #############################
    ### FUNCTION-is_leap_year ###
    #############################
    
    is_leap_year()
    {
            PART1=`expr ${YY} % 4`
            PART2=`expr ${YY} % 100`
            if [[ 0 -eq ${PART1} ]] && [[ 0 -ne ${PART2} ]] || [[ 0 -eq `expr ${YY} % 400` ]]; then #{
                    result=true
    	else
    		result=false
            fi #}
    }
    
    
    ####################
    ### END FUNCTION ###
    ####################
    
    ########################
    ### FUNCTION-get_day ###
    ########################
    
    get_day()
    {
    	DAY="BAD"
    	FIRSTDIGIT=${MM:0:1}
    	SECONDDIGIT=${MM:1:1}
    	if [[ ${FIRSTDIGIT} -eq 0 ]]; then #{
    		if [[ ${DD} -gt 0 ]] && [[ ${DD} -le ${CALENDER[${SECONDDIGIT+1}]} ]]; then #{
    			DAY="GOOD"
    		fi #}
    	else
    		if [[ ${DD} -gt 0 ]] && [[ ${DD} -le ${CALENDER[${MM}]} ]]; then #{
    			DAY="GOOD"
    		fi #}
    	fi #}
    }
    
    ####################
    ### END FUNCTION ###
    ####################
    
    read -p "Enter a date for validation: " DATE
    
    # establish the varible LEN to hold the number of characters in Date, 8 is the only valid number
    LEN=$(echo ${#DATE})
    
    if [ $LEN -eq 8 ]; then #{
     
    	# set date dariables MM, DD, & YY
    	MM=${DATE:0:2}
    	DD=${DATE:2:2}
    	YY=${DATE:4:4}
    
    	if [ ${YY} -gt 0 ]; then #{
    		if [ ${MM} -gt 0 ] && [ ${MM} -lt 13 ]; then
    			if [ ${MM} -eq 02 ]; then
    				
    				is_leap_year ${YY} 
    				if [ $result == true ]; then
    					if [ ${DD} -gt 0 ] && [ ${DD} -le 29 ]; then
    						echo "${DATE} is a valid date!"
    					else
    						echo "${DD} is incalid for this date!"
    					fi #}
    				else
    					get_day ${DD}
    					if [ ${DAY} == GOOD ]; then
    						echo "${Date} is a valid date!"
    					else
    						echo "${DD} is invalid for this date!"
    					fi #}
    				fi #}
    			else
    				get_day ${DD}
    				if [ ${DAY} == GOOD ]; then
    					echo "${DD} is a valid date!"
    				else
    					echo "${DD} is invalid for this date!"
    				fi #}
    			fi #}
    
    		else
    			echo "${MM} is invalid for this date!"
    		fi #}
    
    	else
    		echo "${YY} is invalid for this date!"
    	fi #}
    else
    	echo "Invalid number of digits for a date!"
    fi #}

  4. #4
    Linux Newbie
    Join Date
    Nov 2012
    Posts
    224
    It would seem you need to go 0-8 and 9-11 to index this array properly.
    index 0 can be filled with a fake value[code]array=( _ 31 28 ... ), this way you do not make your code heavier with arithmetics

    note that Garrett85 asks here too

  5. #5
    Linux Newbie
    Join Date
    Dec 2010
    Posts
    122
    note that Garrett85 asks here too

    I see you get around lol.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •