Когда я пытался выполнить сценарий в новой среде, я обнаружил эту ошибку:
[: 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.
Я знаю, что это старый вопрос, но никто не дал простейшего ответа.