语法错误附近的意外令牌`然后'

我创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条目,以帮助您开始改进脚本:

为什么“不好

用引号

一般做法