LINUX.ORG.RU
решено ФорумAdmin

While с двумя условиями

 


1

1

Как сделать, что б цикл while выполнялся, пока одно из условий верное? Или чем можно заменить данную конструкцию? Например, нужно чтоб файлы из dir_1 по одному перемещались в dir_2, до тех пор пока или файлы в dir_1 закончатся или размер dir_2 будет >= 200 Mb.

cd $dir_1
 size_2=$(du -m $dir_2 | awk '{print $1}' )
   while [[ $size_2 -le "200" ]] || [[ -n `ls -1 $dir_1` ]]; do
       file=$(ls -1tr $dir_1 | head -n 1)
       mv -t $dir_2 $dir_1/$file
       size_2=$(du -m $dir_2 | awk '{print $1}' )
   done
В таком виде даже, если папка dir_1 уже пустая, он все равно продолжает работать.

используй 'and' вместо 'or'

anonymous ()

[[ -n «`ls -1 $dir_1`» ]]

Во-первых, ты уже в dir_1, зачем ты ее еще раз указываешь? Во-вторых,

[[ -z "$(ls -A)"]]
В-третих, раз пишешь на баше, учи его, в т.ч. как ставишь кавычки и формировать сабшел. В-четвертых, осиль питон.

anonymous ()
Ответ на: комментарий от annulen

Хватит насиловать баш, изучи какой-нибудь язык программирования

Можно подумать, другой язык сразу починит у него в мозгах знание булевой логики: использовать «и» вместо «или». Ну или bash не язык...

Вот юзать || вне [[ ]] — это да, это можно списать на незнание и нежелание узнать bash.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Ну или bash не язык

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

annulen ★★★★★ ()
Ответ на: комментарий от vodz

Можно подумать, другой язык сразу починит у него в мозгах знание булевой логики

Не факт, но есть шанс, что он увидит ошибку, освободившись от лишних синтаксических деталей

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Не факт, но есть шанс, что он увидит ошибку, освободившись от лишних синтаксических деталей

Увидит если в скрипте будет строка:

set -x
И по моему мнению- кто осилил sh тому легко переходить на PERL а питон изучить как разновидность всякую. :)

Bootmen ★☆☆ ()
cd $dir_1
 size_2=$(du -m $dir_2 | awk '{print $1}' )
   while [[ $size_2 -le "200" ]] || [[ -n "`ls -1 $dir_1`" ]]; do
       file=$(ls -1tr $dir_1 | head -n 1)
       mv -t $dir_2 $dir_1/$file
       size_2=$(du -m $dir_2 | awk '{print $1}' )
   done

Какой же он всё же уродливый, этот ваш баш.

meliafaro ★★★★★ ()
Ответ на: комментарий от annulen

и неэффективно (по несколько форков в каждой строчке)

Ну у вас есть выбор: писать быстро FILES=`ls` или вдумчиво FILES=(*) без форка. На C всегда придётся писать ls :) Главное уметь и то и другое и выбирать по назначению. Ибо кто хает bash зачастую не умеет не только это, но и зачастую вообще ничего.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от anonymous

Шо, glob теперь тоже спавнит процессы?

Как типичненько. Ключевое слово увидел, а перед ним «без» уже сил не было прочитать?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Ибо кто хает bash зачастую не умеет не только это, но и зачастую вообще ничего.

Что отлично харакетризует «программистов» на этом недоязыке

annulen ★★★★★ ()
Ответ на: комментарий от Bootmen

Увидит если в скрипте будет строка set -x

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

кто осилил sh тому легко переходить на PERL

конечно

annulen ★★★★★ ()
Ответ на: комментарий от annulen

Ибо кто хает bash зачастую не умеет не только это, но и зачастую вообще ничего.

Что отлично харакетризует «программистов» на этом недоязыке

Увы. Это отлично характеризует именно неосиляторов основного интерпретатора топика: ибо что там bash, вы как и предыдущий анонимоус вы даже русский не осилили и понять не можете простое как слеза предложение.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от annulen

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

Ясный перец,что перЛ компилирует скрипт перед запуском. Отсюда и все варнинги. А шелл что видит то и поет. Хотя опция

set -x

Покажет где остановился (вылетел) скрипт. И не надо искать ошибку по номеру строки.

Bootmen ★☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.