Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Помогите, пожалуйста, правильно написать bash скрипт.  (Прочитано 843 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Всем доброго времени суток! Интересует скрипт следующего образца:
if ( Условие ) 
 then Если условие истинно, то..
//..выполняются операторы №1                                       
 else В противном случае...
//..выполняются операторы №2 и затем вне зависимости какое условие отработало выполняется следующий такой же блок с таким же условием, но с другими операторами
fi

if ( Условие ) 
 then Если условие истинно, то..
//..выполняются операторы №1                                       
 else В противном случае...
//..выполняются операторы №2 и затем вне зависимости какое условие отработало выполняется следующий такой же блок с таким же условием, но с другими операторами
fi
...



как бы я не пробовал, но у меня не получается сделать последовательное выполнение блоков, они либо выполняют все один и тот же оператор (даже если в первом блоке условие ложно а во втором после работы первого это условие стало правдивым все равно выполняется оператор ложного условия), либо выполняется первый блок, а ко второму дело не доходит.
Вообще таких блоков должно быть 5.
Я новичок в этом деле и если есть возможность реализовать это как то по другому то буду рад вашей помощи.
Спасибо

     
« Последнее редактирование: 05 Апрель 2016, 09:23:43 от BloodyFRag »

Оффлайн DimmKo

  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
    • Image Hosting
(Нажмите, чтобы показать/скрыть)
если я Вас правильно понял.
Ubuntu Server 14.04.3 LTS | x86_64

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 14922
  • Я не слышу.
    • Просмотр профиля
играю в терминалу.
2:L~$
2:L~$ echo $[1+1]
2
2:L~$ ((1>2)) && echo 2
2:L~$ ((1>2)) && echo yes
2:L~$ ((2>1)) && echo yes
yes
2:L~$ ((2>2)) && echo yes
2:L~$ ((2>3)) && echo yes
2:L~$ ((2>1)) && echo yes
yes
2:L~$ ((2>1)) || echo yes
2:L~$ ((2>2)) || echo yes
yes
2:L~$ ((2>3)) || echo yes
yes
2:L~$ ((2>1)) || echo yes
2:L~$
2:L~$

2:L~$
2:L~$ a=5
2:L~$ b=10
2:L~$ echo $a+$b
5+10
2:L~$ echo $[a+b]
15
2:L~$ echo $a+$b=$[a+b]
5+10=15
2:L~$
2:L~$ if ((a>b));then;echo yes;fi
bash: ошибка синтаксиса около неожиданной лексемы `;'
2:L~$ if ((a>b));then echo yes;fi
2:L~$
2:L~$ if ((a<b));then echo yes;fi
yes
2:L~$ if ((a<b+b));then echo yes;fi
yes
2:L~$ if ((a+a<b));then echo yes;fi
2:L~$
2:L~$

~.o

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
BloodyFRag, Или Вы где-то делаете ошибку, или неправильно объясняете что Вы именно хотите. Оптимально было бы привести реальный код, а ещё лучше общую конечную задачу, потому как не исправляй неправильный путь — он всё равно будет приводить к неверным результатам.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
BloodyFRag, Оптимально было бы привести реальный код, а ещё лучше общую конечную задачу.
Конечная задача следующая, есть FTP на убунте, на него сливается видео с регистраторов, колличество дней записи может варьироваться от 24 до 28 дней. И вот нужен скрипт который был чистил последний имеющийся день и если при этом свободного места меньше 95% удалял снова последний имеющийся день.


Пример скрипта и походу совсем не правильного.
#!/bin/bash
space=`df -h /dev/sda6 | awk '{print $5}' | grep % | grep -v использовано% | tail -1 | cut -d "%" -f1 -`
alertvalue="95"

if
[ "$space" -ge "$alertvalue" ]; then
find /mnt/Shared/vdrg/vid -mtime +28 -delete

 if
 [ "$space" -ge "$alertvalue" ]; then
 find /mnt/Shared/vdrg/vid -mtime +27 -delete

  if
  [ "$space" -ge "$alertvalue" ]; then
  find /mnt/Shared/vdrg/vid -mtime +26 -delete

   if
   [ "$space" -ge "$alertvalue" ]; then
   find /mnt/Shared/vdrg/vid -mtime +25 -delete

    if
    [ "$space" -ge "$alertvalue" ]; then
    find /mnt/Shared/vdrg/vid -mtime +24 -delete

    fi
   fi
  fi
 fi
fi

« Последнее редактирование: 05 Апрель 2016, 12:28:22 от BloodyFRag »

Оффлайн DimmKo

  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
    • Image Hosting
BloodyFRag,
кажется, у вас конструкция не совсем так задана
if []; then
...
fi


т.е. любое if закрывается fi
попробуйте так сделать и проверить скрипт.
Ubuntu Server 14.04.3 LTS | x86_64

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
BloodyFRag,
кажется, у вас конструкция не совсем так задана

пробовал и так, но все равно учитывается условие только с первого блока, т.е. Удаляются все дни с +24 до +28, а мне нужно удалить равно столько, что бы было свободно 95% на винтах.

Оффлайн DimmKo

  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
    • Image Hosting
BloodyFRag,
мне кажется, что придется делать через while.
Ща попробую написать.
Ubuntu Server 14.04.3 LTS | x86_64

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
BloodyFRag,
странно, но у меня вот работает
я же не говорю что у меня не работает. ладно, попробую обьяснить по другому, нужно 5 блоков, которые будут выполнятся последовательно:

1 блок
if
[ "$space" -ge "$alertvalue" ] сравнивает переменные и если space больше alertvalue то ...
        then
find /mnt/Shared/vdrg/vid -mtime +28 -delete //.. Удаляем файлы 28-ми дневной давности и переходим ко второму блоку
fi

2 блок
if
[ "$space" -ge "$alertvalue" ] сравниваем переменные и если ПО ПРЕЖНЕМУ space больше alertvalue то ...
        then
find /mnt/Shared/vdrg/vid -mtime +27 -delete //.. Удаляем файлы 27-ми дневной давности и переходим к третьему блоку
fi

3 блок
if
[ "$space" -ge "$alertvalue" ] сравниваем переменные и ДОПУСТИМ  space меньше alertvalue то ...
        then
find /mnt/Shared/vdrg/vid -mtime +26 -delete //.. НЕ удаляем файлы 26-ми дневной давности и прекращаем выполнение скрипта.
fi
...
4 блок
...
5 блок
...

Т.е мне нужно что бы после каждого блока переменные сравнивались и на основе их сравнения либо срабатыва then либо нет.

Оффлайн DimmKo

  • Участник
  • *
  • Сообщений: 224
    • Просмотр профиля
    • Image Hosting
BloodyFRag,
да-да, я вас не так понял сначала.
Вам надо в цикл сделать, что бы он удалил и сравнил. Если после удаления стало 96% - продолжить удалять, если стало 93% - выйти и закончить.
Ubuntu Server 14.04.3 LTS | x86_64

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
BloodyFRag,
да-да, я вас не так понял сначала.
Вам надо в цикл сделать, что бы он удалил и сравнил. Если после удаления стало 96% - продолжить удалять, если стало 93% - выйти и закончить.
Абсолютно верно. Спасибо

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Ну вот видите, выбран неверный путь
Код: Bash
  1. while <проверка_места> ; do
  2.     <определяем_последнюю_дату>
  3.     rm <data>.*
  4. done
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Ну вот видите, выбран неверный путь
Код: Bash
  1. while <проверка_места> ; do
  2.     <определяем_последнюю_дату>
  3.     rm <data>.*
  4. done
Спасибо, но не до конца понял как поведет себя скрипт, если занятого места будет меньше 95%. Я хочу скрипт прописать в крон, что бы каждых 6 часов он проверял место и если занято больше 95%, то только тогда удалять последний день.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 14922
  • Я не слышу.
    • Просмотр профиля
BloodyFRag,
mv file.txt file.txt.bak
rm *.bak
~.o

Оффлайн BloodyFRag

  • Автор темы
  • Любитель
  • *
  • Сообщений: 68
    • Просмотр профиля
Благодаря Azure, родилась у меня следующая идея

#!/bin/bash
space=`df -h /dev/sda6 | awk '{print $5}' | grep % | grep -v использовано% | tail -1 | cut -d "%" -f1 -`
alertvalue="95"
lastday='cd /mnt/Shared/vdrg/vid ; ls -1ARrl --time-style=long-iso | tail -n1 | awk '{print $6}'' //.. ищем папку с последней датой

if
[ "$space" -ge "$alertvalue" ]; then //..если space больше alertvalue то...
find /mnt/Shared/vdrg/vid -name $lastday -type d -delete //.. удаляем то что нашли
fi

правда не знаю сработает ли.





« Последнее редактирование: 05 Апрель 2016, 13:34:08 от BloodyFRag »

 

Страница сгенерирована за 0.069 секунд. Запросов: 24.