无法弄清楚这一点。无法弄清变量中的变量。另外,如果主机关闭,如何使输出静音。
#/bin/bash
for IP in `cat list`; do
output=$(
$name=`snmpwalk -v 2c -c snmp2 $IP SNMPv2-MIB::sysName.0 | grep -o '[^ ]*$'`
$type=`snmpwalk -v 2c -c snmp2 $IP SNMPv2-SMI::mib-2.47.1.1.1.1.13.1 | grep -o '[^ ]*$'`
$soft=`snmpwalk -v 2c -c snmp2 $IP 1.3.6.1.2.1.1.1.0 | grep -i ios | awk -F, '{print $2,$3}'`
)
if [ $? -eq 0 ]; then
echo $IP,echo $output[$name][$type][$soft]
else
echo $IP,null
fi
done
答案 0 :(得分:1)
$name=value
错了。在Bash中它是name=value
。
$name
等变量也在subshell中声明,因此它们无法在外部代码中使用。
代码的其他一些问题:
snmpwalk
的退出代码。使用set -o errexit
为自己的理智。$(foo)
进行命令替换。 `foo`
已过时。cat
award获奖。echo foo,echo bar
将打印foo,echo bar
。 ;
是行分隔符,但只要您感到有诱惑使用它,只需添加换行符即可。答案 1 :(得分:0)
要添加的一些注意事项:
`cat list`
可以简单地$(<list)
,如果您可以使用while read; do ...; done < list
更安全,但这需要项目由换行符分隔。
output
中的{p> output=$()
永远不会获得任何值的输出,因为(name
,type
和soft
中的分配已经接受了它们。
即使您通过删除主要美元符号($
)来正确分配变量,您仍然没有任何值,因为这些分配发生在子shell中。在output=$()
的上下文结束后,这些值会丢失,因此您可以预期name
,type
和soft
之后只有空值。