Я хочу прочитать отметку времени эпохи из файла, а затем сравнить ее с текущим временем эпохи.
Сравнение не работает, и я получаю сообщение об ошибке:
./script.sh: line 13: 1559122886- : syntax error: operand expected (error token is "- ")
#!/bin/bash
RSTL=restart.log
if [ -f $RSTL ]; then
while IFS='|' read -r NRST LRST
do
echo "NRST is: $NRST"
echo "LRST is: $LRST"
done <$RSTL
CTIME=$(date +"%s")
echo "CTIME is: $CTIME"
fi
#LRST=$(date +"%s")
DIFF=$(( $CTIME-$LRST ))
echo "DIFF is: $DIFF"
if [[ $DIFF -gt 86400 ]]; then
echo "1|GREATER"
echo "1|$CTIME" > $RSTL
elif [[ $LRST -lt 86400 ]]; then
echo "LESS THAN"
echo "2|$CTIME" > $RSTL
else
echo "1|NEW"
echo "0|$CTIME" > $RSTL
fi
exit
В строке 12 удалите «#», а в строке 13 удалите «$» из $CTIME и $LRST.
#!/bin/bash
RSTL=restart.log
if [ -f $RSTL ]; then
while IFS='|' read -r NRST LRST
do
echo "NRST is: $NRST"
echo "LRST is: $LRST"
done <$RSTL
CTIME=$(date +"%s")
echo "CTIME is: $CTIME"
fi
LRST=$(date +"%s")
DIFF=$(( CTIME-LRST )) # Remove $ from $CTIME and $LRST
echo "DIFF is: $DIFF"
if [[ $DIFF -gt 86400 ]]; then
echo "1|GREATER"
echo "1|$CTIME" > $RSTL
elif [[ $LRST -lt 86400 ]]; then
echo "LESS THAN"
echo "2|$CTIME" > $RSTL
else
echo "1|NEW"
echo "0|$CTIME" > $RSTL
fi
exit
Я подозреваю, что LRST, установленный в строке 4, неправильно настроен для выполнения арифметических действий, которые я пытаюсь выполнить ниже.
Ошибка, которую вы опубликовали, вызывается строкой 13. Просто удалите $ из CTIME и LRST, это должно быть так.
Когда вы упоминаете необъявленную переменную в $((..))
в форме расширения переменной (например, $var
), она расширяется до пустой строки вместо нуля, поэтому вы получаете ошибку. Не используйте расширения переменных в арифметических расширениях, если в этом нет необходимости. Измените 13-ю строку на следующую, и все готово.
DIFF=$((CTIME-LRST))
Другая проблема с вашим скриптом заключается в том, что вы заполняете NRST
и LRST
в цикле while, и таким образом они недоступны вне цикла. Чтобы исправить это, замените цикл while на:
IFS='|' read -r NRST LRST <"$RSTL"
echo "NRST is: $NRST"
echo "LRST is: $LRST"
И не забывайте заключать в кавычки все расширения переменных, чтобы избежать разделения слов.
Вид с вами здесь, но какие изменения мне нужно сделать?
Измените 13-ю строку на DIFF=$((CTIME-LRST))
Спасибо - это позволяет избежать ошибки, но не выполняет математику. LRST обрабатывается как null/zero
@dross да, потому что вы заполняете его в цикле while, поэтому он недоступен извне.
Это то же самое, что я написал в своем ответе, и я даже показал вам код, как он должен выглядеть. Так почему голосование против?
@dross, это restart.log
однострочный файл или вы хотите выполнить это сравнение для каждой строки в нем?
@oguzismail - это одна строка - я сейчас не читаю файл, а использую awk. Создавал ли я здесь массив, отсюда и математическая ошибка?
На самом деле строка 12 была тестовой (отсюда и комментарий) - я хочу прочитать LRST, используя строку 4. Похоже, что это работает (строка 7 повторяет значение)