Cómo pasar una matriz a una function como un parámetro real en lugar de una variable global

¿Hay alguna manera de pasar una matriz a una function como uno de sus parameters?

Actualmente tengo

#!/bin/bash highest_3 () { number_under_test=(${array[@]}) max_of_3=0 for ((i = 0; i<$((${#number_under_test[@]}-2)); i++ )) { test=$((number_under_test[i] + number_under_test[i+1] + number_under_test[i+2])) if [ $test -gt $max_of_3 ]; then max_of_3=$((number_under_test[i]+ number_under_test[i+1]+ number_under_test[i+2])) result=$((number_under_test[i]))$((number_under_test[i+1]))$((number_under_test[i+2])) fi } } array=(1 2 3 4 5 6 7 8 7 6 5 4 3 2 1) highest_3 echo result=$result array=(1 2 3 4 3 2 1) highest_3 echo result=$result 

que funciona simplemente configurando array y usando array , pero ¿hay una manera de pasar en el array, por ejemplo (1 2 3 4 5 4 3 2 1) como un parámetro real en lugar de simplemente establecer una variable (presumiblemente global)?

Actualización: me gustaría poder pasar otros parameters al lado de esta matriz

Siempre puede pasar la matriz a la function y rebuildla como una matriz dentro de la function:

 #!/usr/bin/env bash foo () { ## Read the 1st parameter passed into the new array $_array _array=( "$1" ) ## Do something with it. echo "Parameters passed were 1: ${_array[@]}, 2: $2 and 3: $3" } ## define your array array=(a 2 3 4 5 6 7 8 7 6 5 4 3 2 1) ## define two other variables var1="foo" var2="bar" ## Call your function foo "$(echo ${array[@]})" $var1 $var2 

El script anterior produce el siguiente resultado:

 $ a.sh Parameters passed were 1: a 2 3 4 5 6 7 8 7 6 5 4 3 2 1, 2: foo and 3: bar 

Puede leer los arguments dentro de la function como una matriz. Y luego invocar la function con esos arguments. Algo como esto funcionó para mí.

 #!/bin/bash highest_3 () { number_under_test=("$@") max_of_3=0 for ((i = 0; i<$((${#number_under_test[@]}-2)); i++ )) { test=$((number_under_test[i] + number_under_test[i+1] + number_under_test[i+2])) if [ $test -gt $max_of_3 ]; then max_of_3=$((number_under_test[i]+ number_under_test[i+1]+ number_under_test[i+2])) result=$((number_under_test[i]))$((number_under_test[i+1]))$((number_under_test[i+2])) fi } echo $result } highest_3 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 # or array=(1 2 3 4 5 6 7 8 7 6 5 4 3 2 1) highest_3 "${array[@]}" 

Puede pasar solo cadenas como arguments. Pero podrías pasar el nombre de la matriz:

 highest_3 () { arrayname="$1" test -z "$arrayname" && exit 1 # this doesn't work but that is the idea: echo "${!arrayname[1]}" eval echo '"${'$arrayname'[1]}"' }