Я пытаюсь вытащить логи и делаю несколько других вещей напрямую. написал небольшую строчку BASH но не работает. Я уверен, что это с условием ЕСЛИ.
sed -rne '/21:25:07/,/21:50:07/ p' server.log.2015-04-21 > /tmp/filename.log ;
du -sh /tmp/filename.log ;
if [`du -sh /tmp/filename.log` -gt 0] then gzip /tmp/filename.log ;
Вы упустили несколько сути, корректное (Только синтетически), форма будет:
if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi
После должно быть пространство test
([
) и прежде ]
Необходимо поместить a ;
(синонимичный с новой строкой) после сначала if
состояние
Необходимо закрыться if
использование условия fi
наконец часть
Также необходимо использовать $()
вместо '' как замена команды, поскольку последняя удерживается от использования в пользу $()
.
Так, буквально Вы управляете, может быть сделан более устойчивым:
if [ $(du -sh /tmp/filename.log) -gt 0 ]; then gzip /tmp/filename.log; fi
Самое главное существует другая основная проблема в Вашем if
условие, Вы сравниваете строку (вывод du -sh /tmp/filename.log
) с целым числом (0
), который является неправильным.
Можно сделать следующее:
if [ $(du -s ./test.txt | cut -f1) -gt 0 ]; then gzip /tmp/filename.log; fi
Или просто:
[ $(du -s ./test.txt | cut -f1) -gt 0 ] && gzip /tmp/filename.log
В последней команде, команде после &&
будет выполнен, только если предыдущая команда возвращает статус выхода 0
т.е. успех. Так, Вам не нужно if
условие, в конце концов.
Также, если Вы используете bash
, попытайтесь использовать bash
ключевое слово [[
вместо test
[
поскольку это обеспечивает много функций это test
не делает. Таким образом, Ваша команда могла принять следующую конечную форму:
[[ $(du -s ./test.txt | cut -f1) -gt 0 ]] && gzip /tmp/filename.log
Или самый простой путь:
[[ -s /tmp/filename.log ]] && gzip /tmp/filename.log
-s
указывает на это, если файл больше, чем 0
в размере затем возвратит true.
if [ `du -sh /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi
пробелы, в если условие и fi в конце завершению, если
Хорошая идея состоит в том, чтобы проверить его сценарии с этот инструмент .
Вот аннотируемая версия Вашей ошибки:
1 #!/bin/bash
2 sed -rne '/21:25:07/,/21:50:07/ p' server.log.2015-04-21 > /tmp/filename.log ;
3 du -sh /tmp/filename.log ;
4 if [`du -sh /tmp/filename.log` -gt 0] then gzip /tmp/filename.log ;
^––SC1009 The mentioned parser error was in this if expression.
^––SC1073 Couldn't parse this test expression.
^––SC1035 You need a space after the [ and before the ].
^––SC1020 You need a space before the ].
^––SC1072 Missing space before ]. Fix any mentioned problems and try again.