![意外标记‘then’附近出现语法错误](https://linux22.com/image/591247/%E6%84%8F%E5%A4%96%E6%A0%87%E8%AE%B0%E2%80%98then%E2%80%99%E9%99%84%E8%BF%91%E5%87%BA%E7%8E%B0%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF.png)
我创建了可用作 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'
我又思考了一个小时,还是不明白哪里出了问题。我以为左括号和美元符号之间没有空格,但你看到的不是这样。
请指教。谢谢。
答案1
为什么是xargs
?我不得不在 POSIX 规范中查找,才知道它的默认值是echo
,但我很少看到它这样使用。Gnu 手册页甚至没有提到这一点。
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 为单位的速度的主机时,它将失败。
您可以更进一步,替换两个管道功能,如下所示:
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
请注意,当未在作业中使用时,仍需要引用捕获的输出以保留任何换行符。