Назад | Перейти на главную страницу

синтаксическая ошибка возле неожиданного токена `then '

Я создал bash-скрипт, который работает как плагин Nagios. Вот его часть:

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'

Я думаю еще час и не могу понять, что не так. Подумал об отсутствии пробела между левой скобкой и знаком доллара, но, как видите, нет.

Пожалуйста, порекомендуйте. Спасибо.

Поскольку вы пишете для bash, вам действительно следует использовать [[, а не [, для тестов. О, и ИСПОЛЬЗУЙТЕ ЕЩЕ ЦИТАТЫ!

Вот некоторые руководства и записи часто задаваемых вопросов, которые помогут вам начать работу по улучшению скрипта:

Почему `` плохо

Использование цитат

Общая практика

Почему 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 ... )

Затем исходный сценарий отсекает последние четыре символа из скорости, но позже код по-прежнему принимает значение «Мбит / с». Сделайте это предположение явным, чтобы сценарий завершился ошибкой при обнаружении хоста, на котором ethtool не сообщает скорость в Мб / с.

Вы можете пойти еще дальше и заменить две функции конвейера, например:

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 по-прежнему необходимо заключать в кавычки, когда они не используются в присваивании, чтобы сохранить любые разрывы строк.