How to pass an array as function argument?
Expanding an array without an index only gives the first element, use
copyFiles "${array[@]}"
instead of
copyFiles $array
Use a she-bang
#!/bin/bash
Use the correct function syntax
Valid variants are
function copyFiles {…} function copyFiles(){…} function copyFiles() {…}
instead of
function copyFiles{…}
Use the right syntax to get the array parameter
arr=("$@")
instead of
arr="$1"
Therefore
#!/bin/bash
function copyFiles() {
arr=("$@")
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one 1" "two 2" "three 3")
copyFiles "${array[@]}"
Output is (my script has the name foo
)
$ ./foo
one 1
two 2
three 3
If you want to pass one or more arguments AND an array, I propose this change to the script of @A.B.
Array should be the last argument and only one array can be passed
#!/bin/bash
function copyFiles() {
local msg="$1" # Save first argument in a variable
shift # Shift all arguments to the left (original $1 gets lost)
local arr=("$@") # Rebuild the array with rest of arguments
for i in "${arr[@]}";
do
echo "$msg $i"
done
}
array=("one" "two" "three")
copyFiles "Copying" "${array[@]}"
Output:
$ ./foo
Copying one
Copying two
Copying three
You could also pass the array as a reference. i.e.:
#!/bin/bash
function copyFiles {
local -n arr=$1
for i in "${arr[@]}"
do
echo "$i"
done
}
array=("one" "two" "three")
copyFiles array
but note that any modifications to arr will be made to array.