Косвенный доступ к массивам bash

Данный пример ввода:

Sent: G1 Z-0.05 F30

Это должно захватить нужную вам информацию:

grep -o 'Z[^ ]*' inputfile
Z-0.05

Или для захвата в реальном -времени:

tail -f inputfile | grep -o 'Z[^ ]*'
1
17.07.2020, 23:06
3 ответа

Вы можете использовать ссылку на имя вашей переменной массива:

for item in "${hostlist[@]}"; do

  declare -n hostvar=$item
  current_host_ip=${hostvar[0]}
  current_host_user=${hostvar[1]}
  current_host_pass=${hostvar[2]}

  echo "IP: $current_host_ip User: $current_host_user Pass: $current_host_pass"
done

Здесь переменная hostvarотносится к переменной с именем $item, которая является массивом host_1или host_2.

Использование косвенной переменной и копии значений массива:

for item in "${hostlist[@]}"; do

    x=${item}[@]
    y=( "${!x}" )

    current_host_ip=${y[0]}
    current_host_user=${y[1]}
    current_host_pass=${y[2]}

    echo "IP: $current_host_ip User: $current_host_user Pass: $current_host_pass"
done
5
18.03.2021, 23:19

Как это часто бывает, я наконец нахожу способ сделать то, что хотел. Но я по-прежнему считаю, что это решение очень -уродливое и использует eval вместо косвенного запроса, поэтому я оставлю вопрос открытым, если кто-нибудь сможет сделать его более красивым, компактным и коротким. Во всяком случае, вот как я это сделал:

for item in ${hostlist[@]}; do
    eval ip=\( \${${item}[0]} \)
    eval user=\( \${${item}[1]} \)
    eval pass=\( \${${item}[2]} \)
    echo "IP: $ip User: $user Pass: $pass"
done

Мне это подходит.

-2
18.03.2021, 23:19

Обычно, когда что-то сложно сделать в оболочке, это происходит потому, что вы пытаетесь сделать что-то, чего не должны пытаться делать в оболочке. Вы уверены, что не должны просто делать:

$ cat tst.sh
#!/usr/bin/env bash

hosts[1]='192.168.0.100 user1 pass1'
hosts[2]='192.168.0.101 user2 pass2'

for item in "${hosts[@]}"; do
    read -r -a current_host <<< "$item"
    echo "IP: ${current_host[0]} User: ${current_host[1]} Pass: ${current_host[2]}"
done

$./tst.sh
IP: 192.168.0.100 User: user1 Pass: pass1
IP: 192.168.0.101 User: user2 Pass: pass2

или аналогичный?

2
18.03.2021, 23:19

Теги

Похожие вопросы