Передача массивов в качестве параметров в bash - PullRequest
177 голосов
/ 30 июня 2009

Как передать массив в качестве параметра в функцию bash?

Примечание: Не найдя ответа здесь о переполнении стека, я сам опубликовал свое несколько грубое решение. Он допускает передачу только одного массива и является последним элементом списка параметров. На самом деле, он вообще не передает массив, а список его элементов, которые повторно собираются в массив с помощью метода named_function (), но это сработало для меня. Если кто-то знает лучший способ, добавьте его сюда.

Ответы [ 13 ]

1 голос
/ 25 мая 2011

Этот работает даже с пробелами:

format="\t%2s - %s\n"

function doAction
{
  local_array=("$@")
  for (( i = 0 ; i < ${#local_array[@]} ; i++ ))
    do
      printf "${format}" $i "${local_array[$i]}"
  done
  echo -n "Choose: "
  option=""
  read -n1 option
  echo ${local_array[option]}
  return
}

#the call:
doAction "${tools[@]}"
0 голосов
/ 04 марта 2019

Мой короткий ответ:

function display_two_array {
    local arr1=$1
    local arr2=$2
    for i in $arr1
    do
       "arrary1: $i"
    done
    
    for i in $arr2
    do
       "arrary2: $i"
    done
}

test_array=(1 2 3 4 5)
test_array2=(7 8 9 10 11)

display_two_array "${test_array[*]}" "${test_array2[*]}"
Следует заметить, что ${test_array[*]} и ${test_array2[*]} должны быть заключены в "", иначе вы потерпите неудачу.
0 голосов
/ 07 апреля 2017

Требование : Функция для поиска строки в массиве.
Это небольшое упрощение решения DevSolar, поскольку оно использует переданные аргументы, а не копирует их.

myarray=('foobar' 'foxbat')

function isInArray() {
  local item=$1
  shift
  for one in $@; do
    if [ $one = $item ]; then
      return 0   # found
    fi
  done
  return 1       # not found
}

var='foobar'
if isInArray $var ${myarray[@]}; then
  echo "$var found in array"
else
  echo "$var not found in array"
fi 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...