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)

Отличная книга, всем рекомендую к прочтению

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

А где твои башизмы применимы кроме баша, который есть искаропки только в Linux?

Linux — это солянка солянок из говна и палок, никакой стандартизации. Уж лучше Windows, которая и Server и все остальные ревизии абсолютно совместимы между собой.

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

Только для фанатиков-сектантов (людей, не способных принять что-либо, идущее в разрез с их убеждениями) и ограниченных (non-open-minded) людей за пределами их мирка ничего не существует.

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

Ты антибашист?

Я tcsh-шист. Хотелось бы книжку по csh/tcsh почитать, а не это вот.

iZEN ★★★★★
()

550 грн за книженцию?!? А не дохренища они хотят за информацию, которой в нете пруд пруди?

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

У меня нет ни одного устройства с установленной Windows, но в отличие от сектантов я отношусь к этой ОС спокойно (ну кроме тех моментов когда она по непонятной причине ломается и неизвестно как её чинить).

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

А ты нет. Звёзд нафлудил, а ума не набрался. ☺

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

Linux — это солянка солянок из говна и палок, никакой стандартизации. Уж лучше Windows, которая и Server и все остальные ревизии абсолютно совместимы между собой.

Linux-овый шелл что раньше что сейчас уделывает Вендовый на раз два. А что там и Сервер и все остальные – ну та они мастера говнохранительства, ничего не поделаешь. Это просто прицел на корпорации. В Linux это называется LTS – 20 лет поддержки, без хлопот. Появилось недавно. За плату разумеется. Дальше 20 лет имеет смысл смотреть?

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

Я — не мартышка вантузячья, еще мне пытхон не хватало использовать! Исключительно С или баш.

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

подсел на литрес, регулярно покупаю

Смотрите, люди, вот так выглядит настоящий враг народа.

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

550р за электронное издание? Какой-то перебор уже

За электронное издание и 1р – перебор. Ровно на 1р.

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

Croco ★★★
()

Берите нормальные языки программирования, баш заш фарш - все это эталонное дерьмо из палаты говна и кала.

PS У него левая рука - fleshlight?

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

никакой стандартизации

Техническая стандартизация – особый (и особо опасный) вид международного терроризма.

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

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

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

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

Не только лишь всем нужен питон.

Многим хватает метапрога :)

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

запекает свои электронные писульки

Все мои книги в электронном виде находятся в открытом доступе. Копировать их, т.е. создавать их копии – можно, что технически, что организационно (в соответствии с условиями лицензии). Точка, всё. А что в них вместо текстового слоя ошмётки и что из них, видите ли, копипаста не работает – ну уж это я сам буду решать, какую информацию, имеющуюся у меня, отдавать, а какую оставить при себе.

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

Без понятия как там в Windows, я не касаюсь, тем более админства.

Но помимо Linux и Windows есть ещё Solaris (он ведь ещё есть?!), *BSD и разумеется macOS. Во всех трёх есть /bin/sh, и ВНЕЗАПНО, это не симлинк на Bash, и с Bash оно нигде не совместимо.

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

с Bash оно нигде не совместимо

Вот оно что. Преклоняюсь перед такими глубокими познаниями и понимаем темы.

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

И поэтому обновление на сервере какого-нибудь совсем старого RHEL — это даже не русская рулетка, а гарантированная смерть. И обновить нельзя, и дыры оставлять нельзя. И всё благодаря отсутствию стандартизации, отсутствию стабильного API и ABI, отсутствию стабильных версий библиотек. Просто потому что софт пишут некомпетентные обезьяны, а не опытные специалисты, которые могут продумать API сразу, чтобы не переделывать через несколько (десятков) версий, ломая совместимость.

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

Windows была приведена в пример как стабильная операционная система, ведущая себя одинаково во всех ревизиях.

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

У тебя бомбит от осознания своей ограниченности (и как следствие неправоты), но ты предпочитаешь списать на мнимый наброс. ☺

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

чтобы не переделывать через несколько (десятков) версий, ломая совместимость

Совместимость для того и нужна, чтобы её ломать. А что старого хлама системы хранения в Linux нет – это неправда. По крайней мере с появлением unshare. Ядро в своих вызовах совместимо со старыми. То что дистроделы этим не занимаются – это от того, что они (пока) не нацелены на корпоративный офисный рынок. Хотя у Канникл уже есть движения. У SUSE они и раньше были, но кто их немцев знает.

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

не нужна

Так главное, а что там есть такое, чего нельзя нагуглить? Покажут, как сделать read, чтобы забрать циферку? Покажут свои баш-портянки? Покажут как не обделаться с IFS и экранировать спецсимволы? Зачем платить за то, что есть в мане и куче материала в интернетах, который бери и читай.

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

Ядро в своих вызовах совместимо со старыми.

Да что ты говоришь! Буквально недавно чел пытался портировать драйвер вебки на новые ядра, и там всё так совместимо, что пришлось писать километры кода, чтобы оно работало хотя бы в свежем и LTS.

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

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

Дровосек. Бумажные книги – насилие над древесиной. Тебя что, информационно изнасиловать за допущение насилия?

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

Буквально недавно чел пытался портировать драйвер вебки на новые ядра

Драйвер – это уровень ядра.

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

У меня нет ни одного устройства с установленной Windows она по непонятной причине ломается

норкоман

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

Это не твой уровень, думаю программисту она слабовата будет. Мне нормально, хотя я предпочитаю чуть более структурированные книги и более строгие в смысле терминов, а в этой автор на пальцах многое объясняет, что портит книгу, имхо. Книга скорее для линуксоида энтузиаста, чем для профи. Ну и перевод наверняка добавляет непоняток.

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

Ломается оно, судя по всему, потому что я что-то делаю не так, как это предполагается делать в этой ОС. Мне не интересно изучать технологии рептилоидов, я пользуюсь Windows раз в пару лет всего по полчаса.

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

Так главное, а что там есть такое, чего нельзя нагуглить?

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

А кто книги не читает, тот и в мане ничего найти не может, так как не знает что там искать, так как не читал про это.

Вот любителям тупить на лоре, SO и так далее книги не нужны.

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

А почему ты задаёшь вопросы на лоре

Потому что я не смог нагуглить или найти в man'е. А что?

crutch_master ★★★★★
()

Не, не катит.

Давайте что-то нормальное типа zsh

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

И поэтому обновление

Стандартизация здесь ни при чём от слова совсем.

софт пишут некомпетентные обезьяны, а не опытные специалисты,

Стандарты пишут дебильные бюрократы, не пригодные ни на что другое и ни к какой конструктивной деятельности не способные. Про то, что вообще комитет как форма взаимодействия заведомо (если угоднго, патологически) не способен дать никакого конструктива, я вообще молчу.

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

Как ты догадался? (%

Ты едь в курсе, что дрова от XP не подходят на Vista? Это о том, что ты сказочник. Втираешь про совместимость, где её нету.

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

Причём здесь комитеты, когда я изначально намекал на POSIX, написанный не бюрократами, а вполне компетентным программистом и когда-то (в то время) неплохим управленцем?

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

Стандарты пишут дебильные бюрократы, не пригодные ни на что другое и ни к какой конструктивной деятельности не способные. Про то, что вообще комитет как форма взаимодействия заведомо (если угоднго, патологически) не способен дать никакого конструктива, я вообще молчу.

Не, бред. Стандарт нужен для ограничения разновидностей %whatever% для профильных задач. Например стандартный топор для рубки дерева. Для дровосека вроде тебя самое то.

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