Использовать элемент массива в качестве имени для другого массива - PullRequest
0 голосов
/ 20 мая 2019

Это, вероятно, то, что нельзя сделать в bash.У меня есть if, который ищет в элементах массива строку, а затем возвращает найденный элемент, который является веб-адресом.Далее мне нужно, чтобы if проверил несколько разных массивов по имени для одной и той же строки и вернул эти совпадающие элементы.

Пока я построил это:

  # Array addresses
  node1=( "http://website111.com/detail.php?hostid=12345" "http://website222.com/detail.php?hostid=23456" "http://website333.com/detail.php?hostid=345678" )
  node2_2=( "http://website111.com/detail.php?hostid=456789" "http://website222.com/detail.php?hostid=567890" "http://website333.com/detail.php?hostid=012345" )
  node3_8=( "http://website111.com/detail.php?hostid=112233" "http://website222.com/detail.php?hostid=223344" "http://website333.com/detail.php?hostid=334455" )
  node4_2=( "http://website111.com/detail.php?hostid=556677" "http://website222.com/detail.php?hostid=889900" "http://website333.com/detail.php?hostid=998877" )
  node5_6=( "http://website111.com/detail.php?hostid=887766" "http://website222.com/detail.php?hostid=776655" "http://website333.com/detail.php?hostid=665544" )

  # Array host names
  hosts=( "node1" "node2_2" "node3_8" "node4_2" "node5_6" )

  # String to find
  value="website222"

  # This is as far as I can get
  for ((index=0; index<${#hosts[@]}; index++)); do
#This works for a single named array-->    if [[ "${node2_2[$index]}" =~ (^|[^[:alpha:]])$value([^[:alpha:]]|$) ]]; then
#But here I want to use the array named saved in $hosts-->    if [[ "${hosts[$index]}" =~ (^|[^[:alpha:]])$value([^[:alpha:]]|$) ]]; then
      printf "%s\t%s\n" "$index" "${node2_2[$index]}"
      printf "%s\t%s\n" "$index" "${hosts[$index]}"
    fi
  done

Я думаю, что «eval» может помочь мне здесь, но я не понимаю синтаксис.

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете сделать это без использования eval.bash предоставляет способ ссылки имен переменных / массивов с помощью встроенных модулей name-ref (typeset/local or declare -n) (требуется v4.3 из bash как минимум).

Вы можете просто сделать

for array in "${hosts[@]}"; do
    declare -n arr="$array"
    for elem in "${arr[@]}"; do
        if [[ $elem =~ (^|[^[:alpha:]])$value([^[:alpha:]]|$) ]]; then
           printf '%s\n' "$elem"
        fi
    done
done

При желании вы также можете распечатать массив, из которого он найден, используя array переменную

printf 'Array Name = %s\n' "$array"

Также см. BashFAQ / 006 - Как я могу использовать переменные (косвенные переменные, указатели, ссылки) или ассоциативные массивы?

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