LINUX.ORG.RU

Книга «Командная строка Linux. Полное руководство. 2-е межд. изд.»

 , ,


5

1

Добрый день! Предлагаю вашему вниманию еще одну книгу — «Командная строка Linux. Полное руководство. 2-е межд. изд.» Ее можно заказать на сайте издательства, и если применить промокод LinuxORG, то получите скидку 30%. Действует на все книги издательства. Также в подарок при покупке бумажной будет ее электронная версия.

Отрывок из книги для ознакомления:

Управление потоком выполнения: циклы while и until

В предыдущей главе мы написали программу, управляемую с помощью меню, для получения разного рода системной информации. Программа работает, но неудобна в использовании. Она выполняет только один выбранный вариант и завершается. Хуже того, в случае ошибочного выбора программа завершается с выводом сообщения об ошибке, не давая возможности повторить попытку. Пользоваться программой было бы намного удобнее, если бы она снова и снова выводила меню и предлагала сделать выбор, пока пользователь не выберет пункт, соответствующий выходу из программы.

В этой главе мы познакомимся с приемами организации циклов, с помощью которых можно реализовать многократное выполнение участков программ. Командная оболочка поддерживает три составные команды для организации циклов.

Циклы

Повседневная жизнь наполнена повторяющимися действиями. Каждодневная поездка на работу, прогулка с собакой и нарезание моркови — все эти действия состоят из повторяющейся последовательности действий. Рассмотрим в качестве примера резку моркови. Этот вид деятельности можно выразить на псевдокоде примерно так:

  1. Взять разделочную доску.
  2. Взять нож.
  3. Положить морковь на доску.
  4. Поднять нож.
  5. Сдвинуть морковь.
  6. Отрезать кусок.
  7. Если вся морковь порезана, завершить операцию, иначе перейти к шагу 4.

Шаги с 4-го по 7-й образуют цикл. Действия внутри цикла повторяются, пока не будет выполнено условие «вся морковь порезана».

while

В bash имеются средства, позволяющие выражать похожие идеи. Представьте, что нам нужно вывести пять чисел по порядку, от 1 до 5. В сценарии на языке bash это можно реализовать, как показано ниже:

#!/bin/bash
# while-count: вывод последовательности чисел
count=1
while [[ $count -le 5 ]]; do
   echo $count
   count=$((count + 1))
done
echo "Finished."

Если запустить этот сценарий, он выведет:

[me@linuxbox ~]$ while-count
1
2
3
4
5
Finished.

Команда while имеет следующий синтаксис:

while команды; do команды; done

Подобно if, команда while проверяет код завершения списка команд. Пока код завершения равен 0, она выполняет команды внутри цикла. В сценарии, приведенном выше, создается переменная count, и ей присваивается начальное значение 1. Команда while проверяет код завершения составной команды [[ ]]. Пока [[ ]] возвращает код 0, команды внутри цикла продолжают выполняться. В конце каждого цикла повторно выполняется команда [[ ]]. После пяти итераций цикла значение переменной count увеличится до 6, команда [[ ]] вернет код завершения,отличный от 0, и цикл завершится, а программа продолжит выполнение с инструкции, следующей непосредственно за циклом.

Цикл while можно использовать для усовершенствования программы read-menu из предыдущей главы:

#!/bin/bash
# while-menu: программа вывода системной информации,
# управляемая с помощью меню
DELAY=3 # Время отображения результатов на экране (в секундах)
while [[ "$REPLY" != 0 ]]; do
   clear
   cat <<- _EOF_
   Please Select:
      1. Display System Information
      2. Display Disk Space
      3. Display Home Space Utilization
      0. Quit
   _EOF_
   read -p "Enter selection [0-3] > "
   if [[ "$REPLY" =~ ^[0-3]$ ]]; then
      if [[ "$REPLY" == 1 ]]; then
         echo "Hostname: $HOSTNAME"
         uptime
         sleep "$DELAY"
      fi
      if [[ "$REPLY" == 2 ]]; then
         df -h
         sleep "$DELAY"
   fi
   if [[ "$REPLY" == 3 ]]; then
      if [[ "$(id -u)" -eq 0 ]]; then
         echo "Home Space Utilization (All Users)"
         du -sh /home/*
      else
         echo "Home Space Utilization ($USER)"
         du -sh "$HOME"
      fi
      sleep "$DELAY"
   fi
else
      echo "Invalid entry."
      sleep "$DELAY"
   fi
done
echo "Program terminated."

Заключив меню в цикл while, мы смогли заставить программу повторять вывод меню после каждой операции выбора. Цикл продолжает выполняться и выводить меню, пока переменная REPLY не получит значение 0, предоставляя пользователю возможность сделать другой выбор. После выполнения выбранной операции выполняется команда sleep, она приостанавливает программу на несколько секунд и дает возможность увидеть результаты до того, как экран будет очищен и на нем вновь появится меню. Когда переменная REPLY получит значение 0, соответствующее варианту «Quit» (выйти), цикл завершится и выполнение продолжится со строки, следующей за done.

Прерывание цикла

В bash имеются две встроенные команды для управления потоком выполнения внутри циклов. Команда break немедленно завершает цикл, после чего выполнение программы продолжается с первой инструкции, следующей за циклом. Команда пропускает оставшуюся часть цикла, и программа переходит к началу следующей итерации цикла. Ниже приводится версия программы while-menu, использующая обе команды — break и continue:

#!/bin/bash
# while-menu2: программа вывода системной информации,
# управляемая с помощью меню
DELAY=3 # Время отображения результатов на экране (в секундах)
while true; do
   clear
   cat <<- _EOF_
      Please Select:
      1. Display System Information
      2. Display Disk Space
      3. Display Home Space Utilization
      0. Quit
   _EOF_
   read -p "Enter selection [0-3] > "
if [[ "$REPLY" =~ ^[0-3]$ ]]; then
   if [[ "$REPLY" == 1 ]]; then
      echo "Hostname: $HOSTNAME"
      uptime
      sleep "$DELAY"
      continue
   fi
   if [[ "$REPLY" == 2 ]]; then
      df -h
      sleep "$DELAY"
      continue
   fi
   if [[ "$REPLY" == 3 ]]; then
      if [[ "$(id -u)" -eq 0 ]]; then
         echo "Home Space Utilization (All Users)"
         du -sh /home/*
      else
         echo "Home Space Utilization ($USER)"
         du -sh "$HOME"
      fi
      sleep "$DELAY"
      continue
   fi
   if [[ "$REPLY" == 0 ]]; then
      break
   fi
  else
     echo "Invalid entry."
     sleep $DELAY
  fi
done
echo "Program terminated."

В этой версии сценария используется бесконечный цикл (цикл, который никогда не завершится сам по себе), в котором команда while проверяет код завершения команды true. Так как true всегда возвращает код 0, цикл никогда не завершится. Этот прием на удивление широко используется в сценариях. Поскольку цикл никогда не завершится сам по себе, программист должен предусмотреть его принудительное прерывание в нужный момент времени. В этом сценарии выход из цикла осуществляется с помощью команды break, когда пользователь выберет пункт 0. В конец других операций добавлена команда continue, чтобы увеличить эффективность работы сценария. Встретив команду continue, сценарий перепрыгнет через остальной код в цикле, который не требуется выполнять для данного выбора. Например, если пользователь выбрал пункт 1, нет никаких причин проверять выбор остальных вариантов.

until

Команда until очень похожа на while, но завершает цикл не когда обнаружит ненулевой код завершения, а наоборот. Цикл until продолжается, пока не получит код завершения 0. В сценарии while-count цикл продолжает выполняться, пока значение переменной count меньше или равно 5. Тот же результат можно получить, переписав сценарий с командой until:

#!/bin/bash
# until-count: вывод последовательности чисел
count=1
until [[ "$count" -gt 5 ]]; do
   echo "$count"
   count=$((count + 1))
done
echo "Finished."

С условным выражением $count -gt 5 команда until завершит цикл в нужный момент времени. Выбор между циклами while и until обычно зависит от того, в каком случае условное выражение будет более читабельным.

Чтение файлов в циклах

Команды while и until могут принимать данные со стандартного ввода. Это дает возможность обрабатывать файлы с их помощью. В следующем примере мы выведем содержимое файла distros.txt, созданного в одной из предыдущих глав:

#!/bin/bash
# while-read: чтение строк из файла
while read distro version release; do
   printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
   "$distro" \
   "$version" \
   "$release"
done < distros.txt

Чтобы перенаправить файл в цикл, мы поместили оператор перенаправления после инструкции done. Цикл будет вводить поля из указанного файла с помощью read. После ввода каждой строки команда read будет завершаться с кодом 0, пока не достигнет конца файла. В этот момент она вернет ненулевой код завершения, и цикл завершится. Цикл можно также использовать в конвейерах:

#!/bin/bash
# while-read2: чтение строк из файла
sort -k 1,1 -k 2n distros.txt | while read distro version release; do
   printf "Distro: %s\tVersion: %s\tReleased: %s\n" \
      "$distro" \
      "$version" \
      "$release"
done

Здесь вывод команды sort передается на стандартный ввод цикла, который выводит поток текста на экран. Но не забывайте, что конвейер выполняет цикл в подоболочке, поэтому после его завершения любые переменные, созданные в цикле, будут потеряны.

Заключение

После знакомства с циклами и ранее представленными командами ветвления, функциями и последовательностями мы получили представление об основных способах управления потоком выполнения в программах. В арсенале bash имеется еще множество хитрых трюков, но все они основаны на этих простых идеях.

Об авторе

Уильям Шоттс (William Shotts) — профессиональный разработчик программного обеспечения с более чем 30-летним стажем, который уже больше 20 лет активно пользуется операционной системой Linux. Имеет богатый опыт разработки программного обеспечения, технической поддержки, контроля качества и написания документации. Также является создателем LinuxCommand.org, образовательного и информационно-просветительского сайта, посвященного Linux, где публикуются новости, обзоры и оказывается поддержка пользующимся командной строкой Linux.

Желаю приятного чтения)

>>> Можно купить на сайте издательства



Проверено: maxcom ()

Ответ на: комментарий от Alve

должен автор всем дарить после N месяцев работы над ним?

Ты любитель передергивать, или вырывать из контекста? А может получаешь зеленые за перевод? Да в принципе мне пофиг. Скачал английскую версию.

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

бумажные - протухшый пережиток прошлого, да и ещё вредный для окружающей среды.

ДОПУСТИМ

электронные книги это и есть цивилизация

МАРКЕТОЛУХ? расскажешь про пользу для окружающей среды от производства пластика и электронных компонентов – корпуса и начинки электронных книг? цивилизация всегда вред для окружающей среды и все попытки это изменить сгладить особого успеха пока, что не имели. так что цивилизация – бремя * человека во все времена

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

@troll_mode_on

Раз

«Знания должны распространяться бесплатно»

то автор должен был выложить книгу для скачивания бесплатно. А если он этого не сделал по недомыслию или же напротив, злому умыслу, то мы, во имя свободного распространения знаний, должны исправить его большую политическую ошибку, товарищ!

@troll_mode_off

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

расскажешь про пользу для окружающей среды от производства пластика и электронных компонентов – корпуса и начинки электронных книг?

Ну если ты привык покупать дерьмо, ломающиеся через год, то это проблема, да.

Jax_iv ()
Ответ на: комментарий от Mischutka

Если ты покупаешь один раз хорошую вещь на годы, то вреда всё равно меньше чем если бы ты покупал, все свои книги в печатном формате. Да и не покупай ты электронную книгу, купишь смартфон ( а ты его по-любому купишь) и читаешь с него. В итоге получается ты взял одно устройство вместо того чтобы, заваливать свои полки макулатурой. В таком случае, вреда как ни крути меньше.

Jax_iv ()

Автор говорит, что в старых линуксах можно было использовать wildcards типа [a-zA-Z], но сейчас лучше использовать классы, такие как [[:alpha:]], иначе могут быть проблемы (если не настроить точно), но не объясняет какие проблемы и почему. Кстати, а какие проблемы могут быть?

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

Использовать [[:alpha:]] вместо [a-zA-Z] и раньше было неправильно, а сейчас и подавно. Это разные множества. Совпадать они могут только в головах граждан одной отдельно взятой страны, для которой остальной мир не существует.

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

Расчётов по нанесению вреда от производства смартфонов/читалок и бумаги, надо понимать, Вы не предоставите? К тому же, со смартфона читать не так удобно, как при чтении книги.

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

Вы не предоставите?

А должен?) Если вы покупаете одно универсальное устройство, читаете с него все свои книги, да ещё оно вам служит долгие годы, то вреда явно меньше, чем если бы вы покупали все эти книги в печатном виде. Разве это не очевидно? Смартфон то вы В ЛЮБОМ СЛУЧАЕ КУПИТЕ, ну так купите смартфон который может без подзарядки хотя бы часов 10 и с него приятно было бы читать те-же самые книги, раз уж вы такой книголюб, в чём проблема?

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

OK // в аргументы ты не умеешь

пользы для окружающей среды от производства пластика и электронных компонентов (корпуса и начинки электронных книг) – НЕТ. ну или ты не осилил )) вспомнить в чём это выражается. про вред говорить надо или ты и так догадаешься? )

если ты привык покупать дерьмо, ломающиеся через год, то это проблема

где ты увидел в моём сообщении жалобы на говнодевайсы ломающиеся через год после покупки?! кстати, если ты не в курсе, то год «стандартный» гарантийный срок на технически сложные изделия (в том числе и электронные книги). если что-то после этого года не работает, то это нормально (так и должно быть :).

p.s. пишу с устройства эксплуатирующегося 13 лет // твой «вангинатор» нуждается в срочной замене ))

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

А это кто такие?

На вопрос вопросом отвечаешь? Лучше расскажи про пользу для окружающей среды от производства пластика и электронных компонентов – корпуса и начинки электронных книг…

А это кто такие?

Все началось с того, что однажды Грете и ее одноклассникам в школе показали видео­фильм об ужасной экологической обстановке на планете: о гигантских свалках промышленных отходов, о причинах изменения климата и огромных мусорных островах в Тихом океане. На юную девушку увиденное произвело такое сильное впечатление, что несколько дней после этого она не могла ни с кем разговаривать. Именно после этого случая у Греты появилась навязчивая идея спасти нашу планету.

А еще он борется с наркоманией, алкоголизмом и игровой зависимостью!

Odalist ★★★★★ ()
Последнее исправление: Odalist (всего исправлений: 1)
Ответ на: OK // в аргументы ты не умеешь от anonymous

Ок, читать ты не умеешь.

пользы для окружающей среды от производства пластика и электронных компонентов (корпуса и начинки электронных книг) – НЕТ.

ДА ЛАДНА!!! Я говорю не о том, что приносит пользу, а о том, от чего меньше вреда, надеюсь понятно?))

p.s. пишу с устройства эксплуатирующегося 13 лет

поздравляю, ну и темболее нафиг тогда бумажные книжки?

// твой «вангинатор» нуждается в срочной замене ))

Ты читаешь какой частью тела обычно? У тебя привычка из контекста вырезать или ты просто его не улавливаешь?

Jax_iv ()
Последнее исправление: Jax_iv (всего исправлений: 2)
Ответ на: комментарий от Odalist

Лучше расскажи про пользу для окружающей среды от производства пластика и электронных компонентов – корпуса и начинки электронных книг…

Ещё один… См. выше

Если вы покупаете одно универсальное устройство, читаете с него все свои книги, да ещё оно вам служит долгие годы, то вреда явно меньше, чем если бы вы покупали все эти книги в печатном виде. Разве это не очевидно? Смартфон то вы В ЛЮБОМ СЛУЧАЕ КУПИТЕ, ну так купите смартфон который может без подзарядки хотя бы часов 10 и с него приятно было бы читать те-же самые книги, раз уж вы такой книголюб, в чём проблема?

И сравни это с тем, как если покупать бумажную книжку на каждый чих.

Jax_iv ()
Последнее исправление: Jax_iv (всего исправлений: 2)
Ответ на: комментарий от Jax_iv

Если вы покупаете одно универсальное устройство, читаете с него все свои книги, да ещё оно вам служит долгие годы, то вреда явно меньше, чем если бы вы покупали все эти книги в печатном виде. Разве это не очевидно?

Нет, неочевидно.

Mischutka ()
Ответ на: комментарий от Jax_iv

И каким образом сравнивать? Где данные по ущербу, наносимый окружающей среде, от производства книги и смартфона?

К тому же смартфон — не самое удобное устройство для чтения, электронная читалка горазда удобнее.

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

Где данные по ущербу, наносимый окружающей среде, от производства книги и смартфона?

Ты понимаешь, что здесь речь не об одной книге, а о всех книгах которые ты потенциально можешь прочитать в электронном виде за срок эксплуатации устройства? И сравни это с той ситуацией когда ты будешь покупать все эти книги в БУМАЖНОМ виде. Если все книги которые ты потенциально можешь прочитать на эл. устройстве за срок его эксплуатации, произвести в печатном виде, то вред от производства этих печатных книг, суммарно будет больше, чем вред от производства одной читалки или смартфона, которые кстати могут прослужить 5-7 лет. Я это имею ввиду, если что.

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

вред от производства этих печатных книг, суммарно будет больше, чем вред от производства одной читалки или смартфона, которые кстати могут прослужить 5-7 лет.

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

Для качественного и долговременного хранения скана книг и журналов, например библиотекам - нужен формат DJVU. Для периодики, и документов - формат PDF. Для редактирования текста ODF.

На бумаге имеет смысл издавать редкие раритетные вещи, или вещи, которые никогда не устареют. Это например, фундаментальные труды Дональда Кнута.

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

как ни крути

Аргумент, достойный лора.

Давай ссылку на исследование, в котором сравнивается ущерб для природы от производства, эксплуатации и утилизации 1 электронной книги и полки бумажных книг.

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

Так не покупайте его, чтобы на него не было спроса и его не производили! Я понимаю, что всех так поступать не заставишь и это в общем звучит утопично в век капроэкономики, но хотя бы самому можно же приучить себя не покупать дерьмо?

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

Давай ссылку на исследование, в котором сравнивается ущерб для природы от производства, эксплуатации и утилизации 1 электронной книги и полки бумажных книг.

У тебя обычная логика включается? Попросить ссылку на исследование, которого сам знаешь что нет (потому что это никому не надо) и потом с улыбкой победителя написать аыуаыаыыа 4.2, балабол, язабан, сливзащитан!!!

Аргумент, достойный лора.

полки бумажных книг

Ага, полки бумажник книг, да… ещё бы написал полочки. Ты же понимаешь, что в 2021-м на одну маааленькую sd карту, книг поместится столько, сколько в бумажном виде тебе всей квартиры не хватит, чтобы их вместить? Догадываешься, что эту sd карточку можно перезаписать, мягко говоря, много раз (если ты не купил дерьмо вместо sd карты)? Ты всё ещё хочешь ссылку на исследования?

Jax_iv ()
Последнее исправление: Jax_iv (всего исправлений: 5)
Ответ на: комментарий от Jax_iv

ну ты маня!

Догадываешься, что эту sd карточку можно перезаписать, мягко говоря, много раз (если ты не купил дерьмо вместо sd карты)?

нахрена её перезаписывать много раз? какое это имеет отношение к книгам (хоть электронным, хоть бумажным)

тогда давай поворачивай свой прогресс вспять – HDD имеют ещё больший объём, чем sd-карты. их можно перезаписывать большее число раз, чем чем sd-карты. sd-карты не нужны! правильно?

Ты всё ещё хочешь ссылку на исследования?

ну нет у тебя этой ссылки. иначе бы ты тыкал ею где надо и где не надо.

и конечно же исследования ненужны. всё же и так понятно. «здравый смысл», «это очевидно» и прочие «непробиваемые доводы» выдают в тебе манипулятора.

и напоследок подумай о следующем аспекте – бумажная книга имеет «срок эксплуатации» сильно больше 5-7 лет и в отличии от электроники не нуждается в питании электричеством во время «эксплуатации». скока там % производства эл. энергии жрет потребительская электроника? ты ж можешь на глаз сказать? 1.0% 0.1% 0.01% мало? (угадал?).

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

нахрена её перезаписывать много раз? какое это имеет отношение к книгам (хоть электронным, хоть бумажным)

Facepalm.jpg Имеется в виду, что ты эту sd карту можешь наполнить до отказа много раз разными книгами. Т.е. забил флэшку до отказа прочитал книжки, потом удалил книжки скачал новые, эти прочитал и так, пока карточка не выработает свой ресурс, ты можешь прочитать 100500 книг с помощью одного устройства, вместо того, чтобы покупать столько книг в печатном виде.

и напоследок подумай о следующем аспекте – бумажная книга имеет «срок эксплуатации» сильно больше 5-7 лет

Ии? Тебе одной книжки хватит на 5-7 лет зачитаться в усмерть ? Нет. А одного эл. устройства хватит.

и в отличии от электроники не нуждается в питании электричеством во время «эксплуатации». скока там % производства эл. энергии жрет потребительская электроника?

Так ты по любому будешь пользоваться потребительской электроникой. Есть у тебя бумажные книжки дома или нет, ты по-любому будешь заряжать смартфон или сидеть за пк, чтобы читать, работать или смотреть котиков. Бумажные книжки тебе потребительскую технику не заменят. Догадаешься в каком случае вреда окружающей среде будет больше, если ты просто пользуешься потребительской техникой или если ты пользуешься потребительской техникой и ещё вдобавок, зачем-то активно скупаешь бумажные книжки?

Jax_iv ()
Ответ на: комментарий от Jax_iv
Ответ на: комментарий от Mischutka

Вы всё ещё с ним «бодаетесь»? Я забил ) Он твердо держится за свои «аргументы» и отрицает всё остальное – для «общения» необходим специальный* настрой и масса свободного времени. )

P.S. Впрочем, есть и польза – оказывается, работа не такая уж и монотонно-нудная вещь. Хотя раньше я был почти уверен ))

anonymous ()