Solved

Sending an array from Function 1 to Function 2

Posted on 2009-03-31
7
721 Views
Last Modified: 2013-12-26
Hi all.

I am trying to send an array from a parent function (not shown) to a child function (see below, configCheck). When I call configCheck from the main script, it works fine. But when I call it from within menuBdcGuide, there is an error.

The log shows that the split has not happened. When configCheck is called directly, the log shows:

Checking database accounts
Checking database configuration

But when it is run from another function, instead what we see is:

Checking database (accounts configuration)

Which means that the code to create the array has not worked correctly.

How can I fix this so I can call configCheck from within my other function? My guess is that the IFS might have to be different. This would be fine, because configCheck is never called directly; it's only ever used from within functions.
configCheck ()
{
 
	# checks to see whether a db key exists
	# version 1.0
	#
	# required inputs:
	# ccKey - key to check for
	# ccDbs - databases to check in
	#
	# returns:
	# 0 - key does not exist
	# 1 - key exists
	# 1001 - function error
	#
	# instructions for use:
	# testDbs=( accounts configuration )
	# configCheck "myKey" testDbs
	# if [ $? -eq 1 ]; then
	#	echo "Key exists!"
	# fi
	
	local ccKey=$1
	local ccDbs=;
	local ccReturn=1001
 
	# Setting the shell's Internal Field Separator to null
	# from http://www.unix.com/shell-programming-scripting/61370-bash-ksh-passing-array-function.html
 
	local OLD_IFS=$IFS
	IFS=''
 
	# Create a string containing "dbs[*]"
	local ccReadArray="$2[*]"
 
	# assign loc_array value to $dbs[*]} using indirect variable reference
	ccDbs=(${!ccReadArray})
 
	# Resetting IFS to default
	IFS=$OLD_IFS
 
	writeLog "Checking database for key $ccKey."
 
	for element in $(seq 0 $((${#ccDbs[@]} - 1)));
	do                  #  ${#ccDbs[@]}
			    #+ gives number of elements in the array.
			    #
			    #  Question:
			    #  Why is  seq 0  necessary?
			    #  Try changing it to seq 1.
		writeLog "Checking database ${ccDbs[$element]}."
		runCommand "db ${ccDbs[$element]} show $ccKey" "quiet"
		if [ $? -eq 0 ]; then
			# previous data exists
			writeLog "Configuration key detected in ${ccDbs[$element]} database!";
			ccReturn=1;
		elif [ $? -eq 1 -a $ccReturn -ne 1 ]; then
			ccReturn=0;
		fi
 
	done
 
	return $ccReturn;
 
} # configCheck

Open in new window

0
Comment
Question by:davidiwharper
  • 3
7 Comments
 

Author Comment

by:davidiwharper
ID: 24046175
Increasing points value
0
 

Accepted Solution

by:
davidiwharper earned 0 total points
ID: 24114027
I have a solution, which was not clear in the code given at the beginning.

Creating the array to pass thus:
local myArray=(accounts configuration)

... doesn't work as expected. What DOES work is creating the array as follows:

local myArray[0]=accounts
myArray[1]=configuration

This works as expected.
0
 

Author Comment

by:davidiwharper
ID: 24114030
There is now a (self-generated) solution for this issue. Please cancel the deletion request if appropriate.
0

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The purpose of this article is to fix the unknown display problem in Linux Mint operating system. After installing the OS if you see Display monitor is not recognized then we can install "MESA" utilities to fix this problem or we can install additio…
The purpose of this article is to demonstrate how we can upgrade Python from version 2.7.6 to Python 2.7.10 on the Linux Mint operating system. I am using an Oracle Virtual Box where I have installed Linux Mint operating system version 17.2. Once yo…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

773 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question