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

миграция скрипта с CentOs на Debian - сообщение об ошибке «[: 10: -lt: неожиданный оператор»

Когда я пытался выполнить сценарий в новой среде, я обнаружил эту ошибку:

[: 10: -lt: unexpected operator

Вот болезненная часть сценария:

end=$((SECONDS+60))
while [ $SECONDS -lt $end ];
do
   # process some queue...
   sleep 5
done

Система происхождения: Amazon Linux AMI выпуска 2013.09 (cpe: / o: amazon: linux: 2013.09: ga)

Целевая система: Debian версии 6.0.7

Я могу прочитать, что версии shell / bash / dash могут различаться, но это все еще для меня непонятно. Я попытался указать правильную оболочку в первой строке скрипта:

 #! /bin/bash

или

 #! /bin/sh

без шансов...

Я также мог узнать, что у пользователей были похожие сообщения об ошибках при использовании оператора == вместо =. Какая же тогда была бы правильная замена -lt? Есть ли другие решения? Любые подсказки приветствуются!

Dash не поддерживает $SECONDS автоматически увеличивающаяся переменная, найденная в Bash. Поскольку переменная не имеет значения, test команда ([) видит перед оператором неустановленную переменную и выдает сообщение об ошибке.

Демонстрация:

$ dash -c 'echo "[$SECONDS]"'
[]
$ bash -c 'echo "[$SECONDS]"'
[0]
$ dash -c '[ $var -lt 3 ]'
dash: 1: [: -lt: unexpected operator
$ dash -c 'var=1; [ $var -lt 3 ]'
$

Вы можете использовать date , чтобы вместо этого выполнить проверку. Имейте в виду, что это может быть дорого, поскольку вы можете многократно вызывать внешнюю утилиту.

Могут быть другие способы выполнить то, что вы пытаетесь сделать, но вы не говорите, что это такое.

Пожалуйста, также смотрите BashFAQ / 068.

Измените первую строку скрипта на:

#!/bin/bash

Если вы используете Debian и (1) любите bash и (2) знаете, что сценарий был написан для системы, которая связала / bin / bash с / bin / sh. Я отказался от попыток попробовать универсальные сценарии / bin / sh, это бесполезное упражнение, если вся система под вашим контролем поддерживает bash.

Я знаю, что это старый вопрос, но никто не дал простейшего ответа.