Solved

Sending an array from Function 1 to Function 2

Posted on 2009-03-31
7
724 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Shell script - run command using variable from a list 2 83
Shell Mail is not working 5 137
Script to modify multiple files in Ubuntu / CentOS 2 61
Shell script issue 4 64
How to remove superseded packages in windows w60 or w61 installation media (.wim) or online system to prevent unnecessary space. w60 means Windows Vista or Windows Server 2008. w61 means Windows 7 or Windows Server 2008 R2. There are various …
Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
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…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…

739 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