LINUX.ORG.RU

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

 ,

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

6

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 ()
Последнее исправление: maxcom (всего исправлений: 3)
Ответ на: комментарий от mumpster

и где ваша фрюха щаз?

Там же, где и обычно: на серьёзных серверах.

Фряху поддерживает Netflix, а чего добился ты Linux?

mord0d ★★★★★
()

«Них@я не понял, но очень интересно.»

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

А линукс скатывается в мастдайку ☹

Вот еще остается ядро вместо С на [censored] переписать, прибить гвоздями systemd, и все — кирдык бобику!!!

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

А линукс скатывается в мастдайку ☹

В том числе поэтому я с него и свалил.

прибить гвоздями systemd

Уже давно.

  • GNOME без systemd функционален не на все сто;
  • fprintd к systemd (а точнее к journald) прибит безальтернативно.

Это из того что я лично видел.

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

Некогда FreeBSD админам Netflix смотреть.

Некогда им ни в игры Сони играть, некогда им ни сериалы смотреть.

BceM_IIpuBeT ★★☆☆☆
()

В версии книги 2017 года: 12+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.).

В версии книги 2020 года: 16+ (В соответствии с Федеральным законом от 29 декабря 2010 г. № 436-ФЗ.)

Интересно, с чем это связано?

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

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

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

занимательное рядом

linux «настолько убог», что приверженцы всех остальных «божественных, гениальных, совершенных» ОС-ей постоянно вынуждены об этом напоминать линуксоидам (коих ~2% от числа всех пользователей. прим.), подкрепляя свои вопли вбросы взгляды тоннами аргументов. хотя, казалось бы ..?

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

GNOME без systemd функционален не на все сто

А без GTK вообще не работает.

fprintd к systemd (а точнее к journald) прибит безальтернативно

А journald об этом знает?

прибить гвоздями systemd

Энивей, как что-то плохое.

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

Энивей, как что-то плохое.

Ну так портируй мне свежую версию fprintd на FreeBSD! Только не тащи этот комбайн, он всё равно работать не будет (и слава Котоне!).

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

Ну так портируй мне свежую версию fprintd на FreeBSD!

А на CP/M не переписать? Пользователей что у CP/M, что у BSD примерно одинаково, полтора землекопа.

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

Пользователей что у CP/M, что у BSD примерно одинаково, полтора землекопа.

Это ты сейчас свои влажные фантазии рассказываешь, или пруфы будут?

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

Man внешне страшен как ядерная война))). Ни тебе шкурок, удобств. Каменный век)))

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

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

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

Интересно, с чем это связано?

Линукс - это как секс. Детям не рекомендуется)))

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

Потому что бумажная книжка это лампово?)

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

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

/bin/sh.

Правда я уже не помню что кому предлагается по дефолту, а при обновлении на следующий релиз руту переключаю шелл на /bin/sh (ибо ncurses из пакетов/портов в процессе обновления отваливается и после первой перезагрузки нельзя залогиниться с tmux/zsh в качестве шелла).

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

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

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

Рутрекер забанили?

Не забанили. И я тоже оттуда скачиваю. 95% книг оттуда смотрю по диагонали и забываю. Остальные 5% более менее читаю. Если книга понравилась или оказалась полезной, то иду и покупаю её, тем самым поддерживая правильных авторов, переводчиков, издательства.

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

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

оказалось, что попугай мёртв. Однако, столь очевидный факт отрицаем продавцом, который ни в какую не признаёт очевидного, изворачивается, уверяет, что попугай отдыхает и прочее. В результате, покупателю приходится произнести пламенную речь, которой при помощи ярчайших эпитетов и метафор он указывает на тотальную биологическую неактивность попугая, на то, что попугай мертв, что попугай отправился на встречу с Творцом, что попугай прекратил земной путь, что этот попугай is no more

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

POSIX, написанный не бюрократами,

офигела твоя голова

давай вспомним на всякий случай историю, как Торвальдс убеждал этих «не бюрократов», что с типом третьего параметра bind (и он же – третий параметр accept) они таки обосрались, и в результате мы теперь имеем socklen_t, который при этом заведомо не может быть ничем кроме int.

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

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

Стандарт нужен для ограничения разновидностей

т.е. для выкидывания с рынка независимых разработчиков. чтд.

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

а потом отдавай бесплатно, или зажмёшь?

Если бы написал, скачать могли все желающие. Бесплатно. А тут, похоже, чел зажал. Знания должны распространяться бесплатно.

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

Воровство не есть хорошо

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

  1. Взаимоисключающие параграфы детектед.
  2. Пиратство != воровство.
  3. Не всякое воровство - зло. …
IRASoldier ★★
()
Последнее исправление: IRASoldier (всего исправлений: 2)
Ответ на: комментарий от Odalist

Если бы написал, скачать могли все желающие. Бесплатно. А тут, похоже, чел зажал. Знания должны распространяться бесплатно.

бесплатно

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

Поразительно, что в 2021 психология жлоба так распространена.

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

Разве автор сам выложил книгу для скачивания бесплатно?

Да этих дровосеков неплохо бы вообще без прибыли оставить.

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

Поразительно, что в 2021 психология жлоба так распространена.

Да, психология жлоба-дровосека, пачкающего священную бумагу своими писульками.

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

Челрвек приходит в этот мир голым. Остальное он берёт взаймы на время жизни у мира. Украсть невозможно. Собственности не существует.

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

Поразительно, что в 2021 психология жлоба так распространена.

Ты аутист, или только прикидываешься таким? Я имею в виду свободные знания, основанные на лицензиях Creative Commons.

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

Ты аутист, или только прикидываешься таким? Я имею в виду свободные знания, основанные на лицензиях Creative Commons.

Книги со «свободными знаниями» тебе значит должны писать и дарить бесплатно? Вот например арифметика вполне свободное знание, учебник арифметики тоже должен автор всем дарить после N месяцев работы над ним?

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

т.е. для выкидывания с рынка независимых разработчиков. чтд.

У тебя же образование есть. Про охрану труда слышал? Вот есть стандарт, что 80 дБа – предел. Это стандарт. Дальше уже считается вредным с соотв. ограничениями.

Тепер на охрану труда всем насрать. Капитализм. Но за уши так никто и не пояснил – они что, стали непробиваемыми?

И вот есть правило. Весьма стандартное. Носить очки и каску на стройке. Но очки нестандартные. Стёкла кривые. Глаза садятся в них быстро. Неограниченное разнообразие рынка умноженное на желание сэкономить на чужом здоровье.

Вот у меня образование. Стандартное. Т.е. включает охрану труда.

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