2015-05-29 4 views
1

Я понимаю, что это, вероятно, очень простая проблема, но я не могу понять, почему это не работает. Я пытаюсь проверить, превышает ли папка более 35 ГБ, и если да, удалите все файлы, которые старше 3 дней.Bash условное заявление

С помощью этого кода:

#!/bin/bash 
MAX=35000000000 
if [ $(du -sb ~/MEGA | cut -f1) \> $MAX ] then 
    find ~/MEGA/* -mtime +3 -exec rm -fr {} \; 
fi 

я получаю следующие ошибки:

syntax error near unexpected token `fi' 
+1

Посмотрите на http://www.shellcheck.net/ – Cyrus

+0

@ Cyrus awesome! – codedude

ответ

5

Вы пропускаете точку с запятой или строку прыжок перед then ключевого слова. Остерегайтесь также, что Bash использует > для сравнения строк, а не цифр. Для численного сравнения вы должны использовать либо -gt, либо Bash-специфический оценочный оператор вычисления арифметических значений ((. Например:

#!/bin/bash 
MAX=35000000000 
if (($(du -sb ~/MEGA | cut -f1) > $MAX)) 
then 
    find ~/MEGA/* -mtime +3 -exec rm -fr {} \; 
fi 

Ссылка: Bash conditional constructs

+3

Просто, чтобы прояснить разницу между строковым и цифровым сопоставлением: '[5 \> 35000000000]' будет оцениваться как истинный, потому что «5» появляется после «3». –

+0

Можно использовать двойные скобки для строк? Или только числовые операции? – codedude

+1

Используйте '(())' только для арифметики. Для строк или других общих случаев у Bash есть свой специфический '[[]]' тестовый оператор, который обрабатывает некоторые пустые строки более грациозно, чем традиционные '[]' – C2H5OH

1

Изменение if [ $(du -sb ~/MEGA | cut -f1) \> $MAX ] then к

if (($(du -sb ~/MEGA | cut -f1) > MAX)); then 

формат, если заявление:

if condition;then 
something 
fi 

Или

if condition 
then 
something 
fi 

Или

if condition;then something;fi 

Примечание:

  1. Вы можете объединить несколько строк с использованием ; между ними

  2. Вы можете уронить $ из $MAX внутри арифметики, если оператор

0

Сообщения об ошибках Bash иногда вводят в заблуждение. Вы забыли запятую перед тем.

#!/bin/bash 
MAX=35000000000 
if [ $(du -sb ~/MEGA | cut -f1) -gt $MAX ]; then 
find ~/MEGA/* -mtime +3 -exec rm -fr {} \; 
fi 
Смежные вопросы