Bash цикл for от 0 до 100. BASH: описание циклов for, while, until и примеры использования. Пример: поиск исполняемых файлов

Модератор сайта сайт. С сегодняшнего дня мы открываем серию интересных тем под общим названием "Вместе изучаем Linux». Темы обсуждений будут в виде статей или сообщений, в которых будут рассматриваться различные материалы по изучению Ubuntu и его производных систем. Материал будет выкладываться не только администрацией ресурса, но и пользователями, желающими поделится своими знаниями (интересны именно личные знания, без копипаста со сторонних ресурсов). Если будут выкладываться объемные темы, предварительно необходимо обговорить с администрацией ресурса, возможно предложенная тема будет выложена в виде отдельной статьи.

Цель - изучение азов Linux систем. Методика, наверное, не совсем обычная, учителей не будет, вернее, каждый пользователь принимающий участие, и будет являться учителем. Открыто в добродушной и теплой обстановке мы будем делиться своими знаниями. Каждая тема обсуждения (урока) будет заканчиваться практическим закреплением новых знаний на своей системе и комментариями со скриншотами.

Начнем первое обсуждение!

Терминал и полезные команды

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

Терминал - графическая программа эмулирующая консоль, говорит нам пользовательская документация с сайта help.ubuntu.ru.

Все команды терминала работают и в консоли. Консоль работает без графической оболочки и как правило необходима при проблемах с запуском системы.

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

Примеры наиболее популярных команд (терминал можно запустить с помощью горячих клавиш: Ctrl+Alt+T):

sudo apt-get update (обновление индекса пакетов)

sudo apt-get upgrade (непосредственное обновление программ)

Рассмотрим составляющие команды:

  • sudo - команда запуска с правами администратора (после ее ввода необходимо ввести пароль администратора, сам пароль не виден, но пугаться не стоит, он вводится и затем жмем клавишу enter);
  • apt-get - является мощным инструментом по установке и обновлению пакетов;
  • update - обновление списка пакетов, upgrade - обновление самих пакетов.

sudo apt-get install название_программы - установка программы;

sudo apt-get remove название_программы - удаление программы;

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

Для большинства команд можно получить справку, введя после команды дополнительную команду --help. Пример: sudo apt-get update --help

И напоследок несколько интересных команд:

uname -a - команда выводит на экран версию ядра Linux;

netstat -tup - список активных сетевых соединений;

apt-get moo - команда хорошего настроения

Популярные эмуляторы терминала

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

Рассмотрим наиболее популярные эмуляторы терминала:

Guake - ниспадающий терминал, напоминающий консоль из популярной игры Quake. Терминал загружается в память, поэтому вызов терминала происходит быстрее стандартного терминала. Доступен в репозитории Ubuntu, поэтому установить можно из Центра приложений Ubuntu.

Final term - "умный" эмулятор терминала. Запоминает вводимые команды и при следующем наборе предлагает их в выпадающем меню. Как и большинство эмуляторов терминала, Final term поддерживает работу горячих клавиш, но через редактирование файла настроек. К сожалению, при ознакомлении он завис, но на это есть объяснение, Final term длительное время не выходит из этапа альфа тестирования.

Переходим к установке. На момент написания данной статьи репозиторий программы не работал, поэтому устанавливать будем из исходников. Дополнительный инструмент Git, который установим для установки Final term нам пригодится в дальнейшем для установки других программ.

sudo apt-get install git build-essential cmake intltool (необходимые довольно популярные инструменты)

sudo apt-get install valac libgtk-3-dev intltool clutter-gtk-1.0 libkeybinder-3.0-dev libgee-0.8-dev libnotify-bin libmx-dev (дополнительные пакеты для GTK)

git clone https://github.com/p-e-w/finalterm.git (загружаем исходники)

cd finalterm/ (переходим в папку finalterm)

mkdir build (создаем папку build)

cd build/ (переходим в папку build)

cmake ..

make (инструмент для автоматической сборки программы из исходного кода)

sudo make install (непосредственно установка)

Terminator - кроссплатформенный эмулятор терминала, поддерживающий системы Microsoft Windows, Mac OS X, Linux , Unix X11. Удобный эмулятор терминала, позволяет создать горизонтальные и вертикальные вкладки, настроить отображение интерфейса, множество горячих клавиш и подключить дополнительные плагины.

Установить можно из Центра приложений Ubuntu.

RXVT (цветной терминал с поддержкой unicode) - очень легковесный эмулятор терминала. Никаких настроек не обнаружил. По минимализму напоминает встроенный XTerm, однако в RXVT удалены некоторые функции, такие как: эмуляция Tektronix 4014 и конфигурирование в инструментальном стиле.

Доступен в родном репозитории Ubuntu.

Ну а тем, кто продолжает использовать стандартный Терминал предлагаю его немного украсить рисунком, например пингвином по имени Tux (официальный талисман Linux).

sudo apt-get install cowsay fortunes-ru

Всем отличного настроения. До встречи в обсуждениях темы.

Выбор эмулятора терминала, по большей части, зависит от ваших личных предпочтений, но бесспорен факт, что лучшим эмулятором терминала для Linux является мощный Terminator.

Что может Terminator:

  • Предоставляте полнофункциональный интерфейс командной строки (CLI) для Linux
  • Располагать несколько окон терминалов в сетку
  • Открывать несколько сессий во вкладках
  • Переносить терминалы мышью
  • Множество настраиваемых горячих клавиш
  • Настраиваемые схемы расположения и профили терминалов
  • Одновременный ввод в нескольких группах терминалов
  • Настраиваемый внешний вид

Чем Terminator лучше других

Terminator — это мощный терминал, построенный на базе привычного терминала GNOME. Если вы часто работаете с терминалом (как большинство пользователей Linux), Terminator облегчит вашу жизнь не только благодаря нескольким вкладкам, но и благодаря размещению нескольких терминалов в одном окне, разбивая его как по горизонтали, так и по вертикали. Вы можете сохранить схемы расположения окон для выполнения определенных задачь и вызывать их нажатием всего пары горячих клавиш.

В чем уступает Terminator

Единственным реальным недостатком Terminator является то, что он достаточно требователен к ресурсам. Если вам нужна очень лёгкая система, особенно на слабой машине, Terminator может быть не самым лучшим выбором.

Конкуренты

У пользователей Linux есть огромный выбор эмуляторов терминала. GNOME Terminal и Konsole (стандартные терминалы GNOME и KDE, соответственно) — отличные терминалы, которые дадут среднему пользователю достаточно возможностей и параметров настройки. Если вы используете терминал от случая к случаю, нет причин переходить на что-то другое.

Если вам нужен лёгкий терминал, вам следует посмотреть в сторону xterm или его ещё более лёгкого конкурента (но менее гибкого в настройке). Ни у одного из них нет такого количества функцию, но они идеальны для маломощных систем, где ну нужны сотни опций.

И, наконец, мне нравятся выпадающие терминалы в стиле Quake, например, Guake (для GNOME) и Yakuake (для KDE). Окно терминала открывается нажатием горячей клавиши, скрываясь всё остальное время в фоне. Это идеальное решение, если обычно вам нужно выполнить всего несколько команд.

Цикл for немного отличается от аналогов в других языках программирования. Прежде всего, он предоставляет Вам возможность выполнять последовательные действия над "словами" в строке.

Цикл while выполняет кусок кода, если тестируемым выражением является истина; и останавливается при условии, если им является ложь (или внутри исполняемого кода встречается явно заданное прерывание цикла).

Цикл until практически идентичен циклу while. Отличие заключается только в том, что код выполняется при условии, если проверяемым выражением является ложь.

Если Вы предполагаете, что while и until очень похожи, Вы правы.

7.1 Пример цикла for

#!/bin/bash for i in $(ls); do echo item: $i done

Во второй строке мы представляем i в качестве переменной, которая получает различные значения, содержащиеся в $(ls).

При необходимости третья строка могла бы быть длиннее; или там могло бы находиться несколько строк перед done (4-я строка).

"done" (4-я строка) показывает, что код, в котором используется значение $i, заканчивается и $i получает новое значение.

Данный скрипт не предполагает большой важности. Более полезным применением цикла for было бы использование его для отбора только каких-то определённых файлов в предыдущем примере.

7.2 C-подобный for

fiesh предложил добавить эту форму цикла. Это цикл for, наиболее похожий на for в языках C, Perl и т.п.

#!/bin/bash for i in `seq 1 10`; do echo $i done

7.3 Пример цикла while:

#!/bin/bash COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done

Данный скрипт "эмулирует" широко известную (в языках C, Pascal, perl и т.д.) структуру "for".

Циклы это крайне удобная штука при написании любых программ или скриптов, скорее даже необходимая. Они позволяют нам выполнять некоторый участок кода заданное количество раз. Естественно в bash есть несколько видов циклов. Мы опишем циклы for in, for, while, until . Хотя for in и for считаются разным синтаксисом одного оператора, на мой взгляд они отличаются друг от друга больше чем while от until.

Цикл со счетчиком for in :

Цикл for in это цикл со счётчиком. Блок кода находящийся в теле цикла повторяется столько раз, сколько значений содержится в списке оператора for in при том, при каждом повторе переменная счётчика (тут она названа var, но естественно можно называть её как угодно) имеет значение следующего элемента списка.
Если ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.
Каждый из элементов <список> может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в <списке>, необходимо использовать инструкцию set
В качестве списка, в цикле for, можно использовать переменную.
В <списке> цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны. Это может очень пригодится при работе с большим количеством файлов.
Если <список> в цикле for не задан, то в качестве оного используется переменная $@ - список аргументов командной строки.
При создании списка аргументов, в цикле for можно использовать подстановку команд.
Вывод цикла может быть перенаправлен со stdout в файл или куда нибудь ещё (подробнее это можно узнать разбирая перенаправление ввода-вывода).

Синтаксис:
for var in <список>
do
<выполняемые команды>
done

Пример:
for names in name1 name2 name3 name4
do
echo $names
done

Оператор цикла for имеет ещё один способ записи - очень похожий на синтаксис оператора for в языке C. В этом случае при инициализации счётчиков задаются начальные значения переменных или одной переменной и после каждого прохода цикла проверяется условие, если проверка возвращает истину, то начинается следующий проход цикла. В блоке <приращение счётчиков> значение наших переменных счётчиков обязательно должны изменятся (не обязательно в большую сторону) так чтобы при проверки условия рано или поздно мы получили значение лож, иначе цикл никогда не закончится. Очень удобный и главное привычный вариант, в случае если какую либо операцию нужно повторить заданное количество раз.

С подобный синтаксис:
for ((<инициализация счётчиков>; <проверка условия>; <приращение счётчиков>))
do
<выполняемые команды>
done

Пример:
for ((var=1; var <= LIMIT ; var++))
do
echo $var
done

Цикл while:

Это достаточно простая конструкция, которая проверяет условие стоящее за оператором while и в случае истинности этого условия выполняет блок команд находящийся между словами do и done и затем опять переходит к проверки условия. В случае если проверка вернет лож, то цикл заканчивается и начинаю выполнятся команды следующие за done . Нужно обязательно следить за тем чтобы <проверка условия> зависела от кода выполняющегося в цикле иначе, если результат проверки не изменяется вы получите бесконечный цикл.
Стандартное устройство ввода, для цикла while, можно перенаправить на файл с помощью команды перенаправления < в конце цикла.

Синтаксис:
while <Проверка условия>
do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
done

Пример:
while [ $var0 -eq 100 ]
do
echo $var
var++
done

Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла будет отличатся от обычного.
Синтаксис (Ещё раз повторюсь, что на выполнение цикла влияет только последнее условие):
while
<условие1>
<условие2>

<условиеN>
do
<выполняемые команды - тело цикла>
done

Цикл until:

Оператор until очень похож на while, он тоже вычисляет условие, но выполняет тело цикла в случае если результатом вычисления будет лож. Может показаться непривычным, но until вычисляет условие перед первым проходом цикла, как и while, а не после него. Как и в случае с циклами for/in, при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do.
Как и в предыдущем случае важно помнить что условие должно зависеть от операций в теле цикла, иначе наш скрипт никогда не завершится.

Синтаксис:
until <Проверка условия>
do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
done

Пример:
until [ $var0 -gt 100] # Проверка условия производится в начале итерации.
do
echo $var
var--
done

Наверное пока хватит. :)

  • Назад
  • Вперёд

Новые статьи:

  • Не включается сетевое обнаружение в Windows 7/8/2008/2012
  • Ошибка: This application failed to start because it could not find or load the Qt platform plugin «windows».
  • Настройка автоматического перезапуска рабочих процессов rphost.exe сервера 1С 8.3
  • Как уменьшить размер лога транзакций (.ldf) в MS SQL 2008/20012

    MS SQL как любая порядочная СУБД промышленного назначения вместе с базой данных ведёт логи транзакция, которые позволяют откатывать состояние...

5

Ваш скрипт закодирован опасным образом.

Во-первых, я предполагаю, что вы используете оболочку Bash, так как вы отметили ее "/ bash" и "/ for".

В моем ответе я процитирую это замечательное Bash guide , что, вероятно, является лучшим источником для изучения Bash.

1) Никогда не использовать Command Substitution , из либо рода, без кавычек. Здесь существует большая проблема: использование некотируемого расширения для разделения вывода на аргументы.

Конкретно говоря, это $(find$ DIRWORK -type d -name work) и $(find$ DIR -type f) претерпит Word Splitting , таким образом, если find находит файл с пробелами в его имени, то есть «имя файла», слово Расщепление результат Bash будет проходить 2 аргумент для for команды итерации по, т. е. один для «файла» и один для «имени». В этом случае вы хотите надеяться, что вы получите «файл: нет такого файла или каталога» и «имя: нет такого файла или каталога», а не потенциально наносить им ущерб, если они действительно существуют.

2) По соглашению переменные среды (PATH, EDITOR, SHELL, ...) и внутренние переменные оболочки (BASH_VERSION, RANDOM, ...) полностью капитализируются. Все остальные имена переменных должны быть строчными. Поскольку имена переменных чувствительны к регистру, это соглашение позволяет избежать случайного переопределения экологических и внутренних переменных.

Это является более безопасной версией вашего сценария, который я рекомендую вам использовать вместо:

My_home="/root/mydir" my_dir=" $my_home/var" dir_work="$ my_home/Local" while IFS= read -r -d "" f; do # I"m guessing that you also want to ignore stderr; # this is where the 2>&1 came from. if lsof -n " $f" | grep "" > /dev/null 2>&1; then echo "hey, I"m safer now!" fi done < <(find "$ dir_work" -type f -print0) while IFS= read -r -d "" f; do echo "2" done < <(find "$dir_work" -type d -name "work" -print0)

Как вы можете видеть, переменная IFS устанавливается равным пуста, таким образом предотвращая read от обрезки переднего и заднего пространства из строки. команда read использует пустую строку (-d "") в качестве разделителя, чтобы читать до он достигает a \ 0. find должен быть m соответственно, поэтому он использует опцию -print0 , чтобы разграничить свои данные с помощью \ 0 вместо новой строки, что, что удивительно и злонамеренно, может быть частью имени файла. Разбиение такого файла на \ n на две части нарушит наш код.

Предыдущий ответ, в котором указано, что find ... | while read name; do ...; done следует использовать для считывания find s выход может быть также плохим. Цикл while выполняется в новой подоболочке со своей копией переменных, скопированной из родителя. Затем эта копия используется для всех, что вам нравится. Когда цикл while закончен, копия подоболочки будет отброшена, а исходные переменные родителя не будут изменены.

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

0

«Никогда не используйте Command Substitution, любого вида, без кавычек». Это просто nitpicking, но можно использовать подстановку команд без кавычек, когда вы устанавливаете переменную: "something = $ (basename" filename with spaces ")". - Smith John 22 апр. 13 2013-04-22 21:43:10

2

For i in $(find$ DIRWORK -type d -name work); do echo "2" done

будет первым выполнить эту линию

Find $DIRWORK -type d -name work

ждать, пока find не завершит выполнение, а затем взять выходной и положить его обратно в петлю for

For i in the output of find; do echo "2" done

только тогда цикл for начнет выполнение.

Так что если find занимает много времени, чтобы закончить цикл for , необходимо подождать много времени, прежде чем он сможет начать.

Попробуйте временные команды find в интерактивном режиме

$ time find $DIRWORK -type d -name work

и посмотреть, как долго это берет.

Также обратите внимание: вы не должны использовать for цикл для перебора имен файлов. Используйте while петлю с read , как это:

Find$ DIRWORK -type d -name work | while read name; do echo "2" done

Бонус: он выполняет цикл while параллельно с find . Это означает, что цикл while выполнит одну итерацию, как только find распечатает одну строку. Для завершения выполнения не нужно ждать find .