#!/bin/bash # array-function.sh: Passing an array to a function and ... # "returning" an array from a function Pass_Array () { local passed_array # Local variable! passed_array=( `echo "$1"` ) echo "${passed_array[@]}" # List all the elements of the new array #+ declared and set within the function. } original_array=( element1 element2 element3 element4 element5 ) echo echo "original_array = ${original_array[@]}" # List all elements of original array. # This is the trick that permits passing an array to a function. # ********************************** argument=`echo ${original_array[@]}` # ********************************** # Pack a variable #+ with all the space-separated elements of the original array. # # Attempting to just pass the array itself will not work. # This is the trick that allows grabbing an array as a "return value". # ***************************************** returned_array=( `Pass_Array "$argument"` ) # ***************************************** # Assign 'echoed' output of function to array variable. echo "returned_array = ${returned_array[@]}" echo "=============================================================" # Now, try it again, #+ attempting to access (list) the array from outside the function. Pass_Array "$argument" # The function itself lists the array, but ... #+ accessing the array from outside the function is forbidden. echo "Passed array (within function) = ${passed_array[@]}" # NULL VALUE since the array is a variable local to the function. echo ############################################ # And here is an even more explicit example: ret_array () { for element in {11..20} do echo "$element " # Echo individual elements done #+ of what will be assembled into an array. } arr=( $(ret_array) ) # Assemble into array. echo "Capturing array \"arr\" from function ret_array () ..." echo "Third element of array \"arr\" is ${arr[2]}." # 13 (zero-indexed) echo -n "Entire array is: " echo ${arr[@]} # 11 12 13 14 15 16 17 18 19 20 echo exit 0 # Nathan Coulter points out that passing arrays with elements containing #+ whitespace breaks this example.