Каков синтаксис IF / ELSE в bash?

Я пытаюсь вытащить логи и делаю несколько других вещей напрямую. написал небольшую строчку 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 ;
2
задан 23 April 2015 в 19:31

3 ответа

Вы упустили несколько сути, корректное (Только синтетически), форма будет:

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.

6
ответ дан 24 April 2015 в 05:31
if [ `du -sh  /tmp/filename.log` -gt 0 ]; then gzip /tmp/filename.log; fi

пробелы, в если условие и fi в конце завершению, если

-2
ответ дан 24 April 2015 в 05:31

Хорошая идея состоит в том, чтобы проверить его сценарии с этот инструмент .

Вот аннотируемая версия Вашей ошибки:

   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.

Источник

4
ответ дан 24 April 2015 в 05:31

Другие вопросы по тегам:

Похожие вопросы: