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)
Ответ на: комментарий от esperantisto

Зачем тебе на рутрекере, бичёвка? Книги нужно на бумаге читать, а не слепнем pdf-ки разглядывать.

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

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

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

Много, да. Средняя цена: ~1000 за книгу по IT. Причём это КБС который разваливается порой после первого прочтения, а бумага газетная. Перевод кривой, вычитка и вёрстка - тоже. За некоторые > 3000 просят. А ангоязычные издания в том же формате что и русские издание (1 в 1 книга) меньше 3000 не стоят. Пусть все погибнут. Душу и рву им волосы.

anonymous
()

издательский дом «Питер» любит баловаться с цифирками

книга Командная строка Linux. Полное руководство. 2-е межд. изд. — СПб.: Питер, 2020. — 544 с.: ил. — (Серия «Для профессионалов»).
давно куплена и лежит на винте, в телеге тоже можно найти в ebook качестве

оригинал:
2019 by William Shotts.
The Linux Command Line, 2nd Edition: A Complete Introduction
ISBN 978-1-59327-952-3, published by No Starch Press.

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

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

Нафига мне, категорическому хомячку, эти ваши руби и питоны? А баш – это не только про написание скриптов, но и про удобство в cli, вообще про Линукс в самом широком смысле.

papin-aziat ★★★★★
()

Конские цены. Я правда давно не покупал книги об IT, но довольно плотно подсел на литрес, регулярно покупаю там художественную литературу, как аудиокниги, так и электронные. Так вот, средняя цена на электронную книгу редко превышает 200 рублей, а обычно крутится в районе 150.

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

Из цифры только fb2 и epub годятся для чтения с Pocket’а, с экрана не то. Почти всё что есть в ЛитРес можно найти в сети. Покупатели часто сами выкладывают

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

Это для всей компьютерное литературы так, не только Питерской. Продают издания 2021, а оригинал 2013. Понятно что всё устарело, а ценник под 2000

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

Ну я в основном fb2 и предпочитаю для чтения. Читаю с телефона из родного приложения от литрес, оно довольно удобное. Но читаю редко, предпочитаю больше аудиокниги. Слушаю их запойно от метро до работы, на работе, если никто не мешает и всю обратную дорогу от работы до дома. При этом для меня как будто открывается портал, где я как по телевизору смотрю все события в аудиокниге. Удивительное свойство мозга. Из-за него боюсь их слушать в машине: если начну, то въеду в первый же столб.

Rinaldus ★★★★★
()
Ответ на: комментарий от papin-aziat

Нафига мне, категорическому хомячку, эти ваши руби и питоны? А баш – это не только про написание скриптов, но и про удобство в cli, вообще про Линукс в самом широком смысле.

Сморозил однако.
https://www.gnu.org/software/bash/

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

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

Само-собой - ссылка на скачивание оригинала прозрачно намекает: https://sourceforge.net/projects/linuxcommand/files/TLCL/19.01/TLCL-19.01.pdf/download

Разве что часть косяков надмозгов повыловили, в чём я откровенно сомневаюсь.

zabbal ★★★★★
()

который уже больше 20 лет активно пользуется операционной системой Linux.

Не показатель. Я почти 20 лет только на Linux и только недавно про devmapper узнал и формулу Load Average.

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

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

Много, да. Средняя цена: ~1000 за книгу по IT. Причём это КБС который разваливается порой после первого прочтения, а бумага газетная. Перевод кривой, вычитка и вёрстка - тоже. За некоторые > 3000 просят. А ангоязычные издания в том же формате что и русские издание (1 в 1 книга) меньше 3000 не стоят. Пусть все погибнут. Душу и рву им волосы.

Особенно хочется матерится на ох******х, когда видишь цены на Топ 100 книг по версии OZON где треть книг 300-500 руб. А самая дорогая – это подарочное издание в офигенном качестве и по цене ниже большинства нормальных IT-книг.

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

Ну вот Золотой жук По, шикарная вещь. 3 739 Далее с 8 книги цена падает до 1500, а по IT дорого, ибо тренд.

За книгу в этомй теме там просят 1 679₽ (2814 ₽ старая цена О_о) Unix и Linux: руководство системного администратора 4420₽ (5590₽)

Когда сделают доступные e-ink устройства, чтобы pdf A4 могли глотать? В сети столько литературы.

anonymous
()

Опять рИклама на главной в новостях?

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

Годно.

Чиво? Не рабочий пример же, на системах из каробки. Я вот про это:

[me@linuxbox ~]$ while-count

anc ★★★★★
()

Также в подарок при покупке бумажной будет ее электронная версия.

Бумажные носители – мечта дровосека.

kostyarin_ ★★
()

Заключение

...

Об авторе

че-то короткая какая-то книжечка получилась. а по факту молодняку не нужно, а старички и сами в теме. вообще не понимаю, о чем думает издательство:(

Уильям Шоттс (William Shotts)

так это перевод что ли?:(

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

было уже. ты лет на 20-30 опоздал с этой идеей.

crypt ★★★★★
()

Первое издание

Я ещё первое издание не прочёл, а тут уже и второе. Читаю параллельно с английскими вариантами. man’ы никто не отменял, как они могут мешать друг-другу с книгой - не понимаю комментаторов.

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

Ещё одна бичёвка! Вы как этот pdf читаете? Там же > 500 страниц. Слепни. Что за терпкая порода. Мучите сами себя. Тьфу

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

Слепни.

Причом тут кровососныя мухи?

терпкая порода.

людоед?

anonymous
()

о, круто, книжка про морковку. теперь венде точно нечем крыть...

alt-tab-let ★★
()
Ответ на: комментарий от anonymous

Много, да. Средняя цена: ~1000 за книгу по IT.

Бумажные книги по IT потеряли всякий смысл. По Computer Science нет.

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

Мне обложка напомнило один мультик и я стал плакать :(

Да очевидно, что это робот-Попай с планеты Шелезяка. :)

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

Цена!

Купил бы рублей за 500. Все никак не перестроюсь на эти конские новые цены на книги…

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

Почему потеряли? А computer science это не то?

Различают. Да и в CS тоже большая часть не нужна. Всякие там Mastering Python, Все это устаревает, не успев выйти в свет. В бумажном виде это просто лишняя трата денег, создание у себя хлама, увеличение мусора на планете. Я покупал книги, когда интернета не было еще. Но вот есть книги, которые можно купить и которые могут быть долго актуальны. Как минимум Кнут, SICP, всякие книги по теории алгоритмов, по логике предикатов первого порядка (это я просто пишу, что приходит в голову) и т. п.

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

То что устаревают это да, хотя чаще старьё и печатают, вот в чём дело. А классику типа SICP у нас тоже не могут нормально издать: кривой перевод, куча опечаток и КБС

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

Че это ? bash, sh, zsh, etc ?

В Linux таки Bash. То есть башизмы и всё такое, что в остальном мире за пределами Linux ценности имеет чуть меньше чем ноль.

Забавно, что GNU, пропихивая POSIX как стандарт, в итоге сами на него забили.

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