bash 数组中的间接访问

bash 数组中的间接访问

我正在尝试执行以下间接任务:

host_1=(192.168.0.100 user1 pass1)
host_2=(192.168.0.101 user2 pass2)

hostlist=( "host_1" "host_2" )

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

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

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

done

我试图了解应该如何执行这个间接请求,因此我从数组“hostlist”中提取主机名,然后我应该执行间接请求来提取主机 1 IP、用户和通行证。但是当我尝试这样做时,我要么只使用第一个变量(仅 IP),要么使用其中的所有变量(如果我将 [@] 添加到变量名的末尾)、空结果或来自的数字大批。我不明白如何首先将 host_1 数组复制到 current_ 变量中,然后(在我的脚本完成一些工作之后)我需要将 host_2 变量传递给相同的变量 current_ 。

你能指出我的错误吗?我认为这是解决问题的方法,我只是不能采用它:

间接返回数组中的所有元素

答案1

您可以使用对数组变量的名称引用:

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

这里,变量指的是名为 array或 的hostvar变量。$itemhost_1host_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

答案2

通常,当某些事情在 shell 中难以完成时,这是因为您正在尝试做一些不应该在 shell 中执行的操作。您确定您不应该只是这样做:

$ 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

或类似的?

答案3

正如经常发生的那样,我终于找到了一种方法来制作我想要的东西。但我仍然认为这个解决方案非常丑陋,并且使用 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

这对我行得通。

相关内容