Длина массива, переданного в качестве аргумента функции - PullRequest
1 голос
/ 01 мая 2020

Мне нужно передать массив в качестве аргумента функции (это нормально), а затем получить его длину (у меня это не работает).

Рабочий пример:

function foo {
 declare -a idn=("${!1}")
 echo "idn=${idn[@]}"
 n=${#idn[@]}
 echo "n=$n"
}

identifier=(a b c d e)
echo "len is ${#identifier[*]}"
echo foo
foo identifier[*]

Вывод:

len is 5              #that is OK
foo
idn=a b c d e
n=1                   #should be 5

Длина вне функции в порядке, но она не внутри функции.

Я использую GNU bash, версия 4.3.42 (1) -релиз (x86_64-suse- linux -gnu)

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Ваш оригинальный скрипт должен работать, просто изменив последнюю строку на:

foo "identifier[@]"
2 голосов
/ 01 мая 2020

Либо используйте переменную -n ameref, например:

#!/usr/bin/env bash

foo ()
{
  # If argument 1 is not an array, return an error
  [ "${!1@a}" = 'a' ] || return 2

  # Make idn a nameref variable referrencing the array name from argument 1
  declare -n idn="$1"

  echo 'idn:' "${idn[@]}"
  n=${#idn[@]}
  echo 'n:' "$n"
}

identifier=(a b c d e)
echo "len is ${#identifier[*]}"
echo foo
foo identifier

, либо передайте элементы массива как значение:

#!/usr/bin/env bash

foo ()
{
   declare -a idn=("${@}")

   echo 'idn:' "${idn[@]}"
   n=${#idn[@]}
   echo 'n:' "$n"
}

identifier=(a b c d e)
echo "len is ${#identifier[*]}"
echo foo
foo "${identifier[@]}"
0 голосов
/ 01 мая 2020

Если вы хотите передать индивидуальные аргументы массива a, b, c, d, e в вашу функцию, используйте foo "${identifier[@]}". Затем в функции вы можете использовать $# для получения количества аргументов.

Или, если вы хотите передать имя переменной в вашу функцию, вы можете использовать локальную nameref переменную idn которая является ссылкой на массив identifier.

foo() {
  echo "n=$#"
}

foo2() {
  local -n idn=$1
  echo "n=${#idn[@]}"
}

identifier=(a b c d e)
echo "len is ${#identifier[*]}"
foo "${identifier[@]}"
foo2 identifier

Вывод:

len is 5
n=5
n=5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...