意外标记‘then’附近出现语法错误

意外标记‘then’附近出现语法错误

我创建了可用作 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请注意,当未在作业中使用时,仍需要引用捕获的输出以保留任何换行符。

答案2

由于您是为 bash 编写的,因此您确实应该使用 [[,而不是 [,进行测试。哦,多用引号!

以下是一些指南和常见问题解答,可帮助您开始改进脚本:

为什么 `` 不好

使用引号

一般做法

相关内容