Bash中变量的变量

时间:2014-06-23 12:51:01

标签: bash

无法弄清楚这一点。无法弄清变量中的变量。另外,如果主机关闭,如何使输出静音。

#/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

2 个答案:

答案 0 :(得分:1)

$name=value错了。在Bash中它是name=value

$name等变量也在subshell中声明,因此它们无法在外部代码中使用。

代码的其他一些问题:

  • 它仅检查 last snmpwalk的退出代码。使用set -o errexit为自己的理智。
  • 使用$(foo)进行命令替换。 `foo`已过时。
  • Use More Quotes <!/ LI>
  • Useless Use of cat award获奖。
  • 使用portable shebang line(免责声明:我自己的答案)
  • echo foo,echo bar将打印foo,echo bar;是行分隔符,但只要您感到有诱惑使用它,只需添加换行符即可。

答案 1 :(得分:0)

要添加的一些注意事项:

`cat list`可以简单地$(<list),如果您可以使用while read; do ...; done < list更安全,但这需要项目由换行符分隔。

output中的{p> output=$()永远不会获得任何值的输出,因为(nametypesoft中的分配已经接受了它们。

即使您通过删除主要美元符号($)来正确分配变量,您仍然没有任何值,因为这些分配发生在子shell中。在output=$()的上下文结束后,这些值会丢失,因此您可以预期nametypesoft之后只有空值。