Данный пример ввода:
Sent: G1 Z-0.05 F30
Это должно захватить нужную вам информацию:
grep -o 'Z[^ ]*' inputfile
Z-0.05
Или для захвата в реальном -времени:
tail -f inputfile | grep -o 'Z[^ ]*'
Вы можете использовать ссылку на имя вашей переменной массива:
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
Как это часто бывает, я наконец нахожу способ сделать то, что хотел. Но я по-прежнему считаю, что это решение очень -уродливое и использует 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
Мне это подходит.
Обычно, когда что-то сложно сделать в оболочке, это происходит потому, что вы пытаетесь сделать что-то, чего не должны пытаться делать в оболочке. Вы уверены, что не должны просто делать:
$ 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
или аналогичный?