我试图通过执行 snmpwalk 来获取网络接口,但无法在数组中分离,该变量全部存储在元素 0 中
ifname=(\$(snmpwalk -Oqv -v2c -c comm xxx.xxx.xxx.xxx 1.3.6.1.2.1.2.2.1.2))
这是在heredoc内部
我怎样才能做到这一点?
答案1
你的代码几乎可以工作了。输出:
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
产生所需的输出。要将其存储在数组中,请使用bash
的readarray
内置函数。主要的警告是,由于管道如何处理子 shell 和环境变量,因此有必要专门重定向标准输入(通常通过命令替换),而不是通过管道输入到readarray
,如下所示:
readarray -t if_names < <(
snmpwalk -Oqv -v2c -c public (somehost) 1.3.6.1.2.1.2.2.1.2
)
for i in "${!if_names[@]}"
do
printf '%d: %s\n' "$i" "${if_names[$i]}"
done
0: public
1: vlan3
2: igb1
3: igb2
4: igb3
5: lo0
6: vm-public
7: tun0
答案2
您可能想使用snmptable
(关联)代替snmpwalk
。
有一个教程这里。
答案3
您在示例中所做的将把值设置到一个数组中,并进行一个小的修正。我必须在 $ 之前取出 escape \
bash$ ifname=($(snmpwalk -Oqv -v2c -c $comm $device 1.3.6.1.2.1.2.2.1.2))
bash$ echo ${#ifname[@]} # how many elements in the array
58
bash$ echo ${ifname[0]} # item at index 0
"GigabitEthernet1/1/1"
bash$ echo ${ifname[1]} # item at index 1
"GigabitEthernet1/1/2"
bash$ echo ${ifname[5]} # item at index 5
"GigabitEthernet1/1/6"
您可能会发现,如果 snmpwalk 的返回中有空格,则此方法不起作用。使用 IFS 将输入字段分隔符限制为换行符将有所帮助(请参阅此堆栈溢出答案我发现这对解决这个问题很有帮助)
OLDIFS="$IFS"
IFS=$'\n' # newlines are the only separator
IN=($(my_command ...))
IFS="$OLDIFS"