我创build了作为Nagios插件的bash脚本。 这是它的一部分:
44 CURDUPLEX=`ethtool $IFACE|grep "Duplex"|cut -d ':' -f 2|xargs` 45 CURSPEED=`ethtool $IFACE|grep "Speed"|cut -d ':' -f 2|xargs|sed 's/.\{4\}$//'` 46 47 if [ $CURSPEED -eq $SPEED ]; then 48 if [ $CURDUPLEX = $DUPLEX ]; then 49 echo "OK: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex." 50 exit $OK 51 else 52 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s [OK] and $CURDUPLEX duplex (Expected $DUPLEX)." 53 exit $CRIT 54 fi 55 elif [ $CURDUPLEX = $DUPLEX ]; then 56 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex [OK]." 57 exit $CRIT 58 else 59 echo "CRITICAL: Interface $IFACE link at ${CURSPEED}Mb\s and $CURDUPLEX duplex (Expected $DUPLEX)." 60 exit $CRIT 61 fi 62 }
当我运行它时,我看到错误:
]# ./check_physlink usage ./check_physlink: line 48: syntax error near unexpected token `then' ./check_physlink: line 48: ` if [ $CURDUPLEX = $DUPLEX ]; then'
我想了一个小时,却不明白什么是错的。 想到左括号和美元符号之间没有空格,但没有你所看到的。
请指教。 谢谢。
为什么xargs ? 我必须在POSIX规范中查找它,以提醒它默认为echo ,但是我很less看到它是以这种方式使用的。 牛头人的网页甚至没有提到这一点。
44 CURDUPLEX=`ethtool $IFACE|grep "Duplex" ...` 45 CURSPEED=`ethtool $IFACE|grep "Speed" ...`
两次调用ethtool会给Nagios性能一个不好的名字。
尝试像这样:
toolsays=$( ethttool $IFACE ) CURDUPLEX=$( echo "$toolsays" | grep Duplex ... ) CURSPEED=$( echo "$toolsays" | grep Speed ... )
然后,原来的脚本从速度上削减了最后四个字符,但后来的代码仍然假设为“Mb / s”。 假设这个假设是被解释的,所以当脚本遇到一个ethtool没有以Mb / s报告速度的主机时将会失败。
您可以更进一步,并replace两个pipe道function,如:
function duplex_state { typeset toolsaid=$1 s= : ${toolsaid:?} s=${toolsaid##*Duplex: } echo ${s%%$'\n'*} } function speed_value { typeset toolsaid=$1 s= : ${toolsaid:?} s=${toolsaid##*Speed: } echo ${s%%Mb/s*} }
以下是你如何打电话给他们:
CURDUPLEX=$( duplex_state "$toolsays" ) CURSPEED=$( speed_value "$toolsays" )
请注意,如果在任务中不使用ethtool捕获的输出时,仍然需要引用它以保留任何换行符。
既然你在为bash写代码,你应该使用[[,not [,for tests。 哦,并使用更多的报价!
以下是一些指南和FAQ条目,以帮助您开始改进脚本:
为什么“不好
用引号
一般做法