Bash обучение. Написание скриптов в Linux. Каковы принципы составления сценариев на Bash? Если совпадение не найдено

Тема программирования на bash из разряда тех, которые могут быть рассмотрены и в пару, и в сотни страниц. Гарольд Родригес (Harold Rodriguez) объясняет эту тему в приведенном ниже руководстве из двух частей. Его прекрасный и яркий стиль позволил ему охватить все существенные черты программирования на bash буквально на нескольких страницах.

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

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

Если вы никогда не программировали на bash ранее - сейчас самое время начать. Даже если у вас мало знаний о том, что такое bash, вы вполне можете посмотреть на множество интересных скриптов, разбираемых Гарольдом.

Введение

Подобно остальным оболочкам, доступным в Linux, Bourne Again shell (bash) является не только, собственно, командной оболочкой, но и языком для написания сценариев (скриптов) (слова «сценарий» и «скрипт» обычно являются синонимами - прим. перев. ). Скрипты позволяют в полной мере использовать возможности оболочки и автоматизировать множество задач, которые иначе потребуют для своего выполнения ввода множества команд. Многие программы, работающие внутри вашего компьютера с Linux - это скрипты. Если вы захотите узнать, как они работают, или изменить их, важно понимать их синтаксис и семантику. Кроме того, понимая язык bash, вы сможете писать свои собственные программы, чтобы выполнять разные задачи теми способами, которые выберете сами.

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

Подробный список директорий

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

Так все-таки программирование (programming) или написание скриптов (scripting)?

Новичков в программировании, как правило, озадачивает разница между, собственно, программированием и языками скриптов. Программы, написанные на каких-то языках программирования, обычно гораздо более мощные по возможностям и работают намного быстрее, чем программы, написанные на языках сценариев. Примеры языков программирования - C, C ++ и Java. Создание программы на каком-либо языке программирования обычно начинается с написания исходного кода (текстовый файл, содержащий инструкции о том, как будет работать окончательная программа), затем его необходимо скомпилировать (собрать) в исполняемый файл. Этот исполняемый файл не так легко переносить между различными операционными системами. Например, если вы напишете на программу на C для Linux, вы не сможете запустить ее в Windows. Чтобы сделать это, вам придется перекомпилировать исходный код под Windows. Написание скрипта также начинается с написания исходного кода, который не компилируется в исполняемый файл. Вместо этого интерпретатор оболочки последовательно читает инструкции в файле исходного кода и выполняет их. К сожалению, поскольку интерпретатор должен читать каждую инструкцию, скорость исполнения скрипта обычно медленнее (намного медленнее - прим. перев. ), чем у скомпилированной программы. Основным преимуществом скриптов является то, что вы можете легко переносить исходный файл в любую операционную систему и просто запускать их (естественно при наличии интерпретатора для это й операционной системы - прим. перев. ).

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

По большей части вы Не нужно слишком беспокоиться об этом явлении. Другим термином, с которым вы можете столкнуться, является выполнение сценария. Прежде чем мы сможем выполнить скрипт, он должен иметь набор разрешений на выполнение. Если вы забудете предоставить это разрешение перед запуском скрипта, вы просто получите сообщение об ошибке, сообщающее вам как таковое, и никакого вреда не будет. Сокращение 755 часто используется для скриптов, так как позволяет владельцу писать или изменять сценарий и для каждого, чтобы выполнить скрипт.

Bash - это язык сценариев. Он отлично подходит для написания небольших программ, но если вы планируете делать какие-то мощные приложения, выбор для этого какого-либо языка программирования предпочтительнее для вас. Другие примеры скриптовых языков Perl, Lisp, и Tcl.

Что нужно знать для написания своих скриптов ?

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

  • Ничего после # не выполняется.
  • Это только для нашей справки.
Каталоги разделяются символом:.

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

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

Для этого необходимо знание основных команд Linux. Например, вы должны знать, как копировать, перемещать и создавать новые файлы. Обязательно умение использовать какой-либо текстовый редактор. Существуют три основных текстовых редактора в Linux: vi, emacs и pico (автор еще забыл nano, который лучше всего подходит начинающим, если не учитывать еще и mcedit. - Прим. перев. ). Если вы не знакомы с vi или emacs, используйте pico или другой простой в использовании текстовый редактор.

Как устроены bash-скрипты

Это первая строка сценария выше. После этого это путь к интерпретатору, который должен использоваться для запуска остальных строк в текстовом файле. Шейнг должен находиться в самой первой строке файла. Также не должно быть пробелов перед символом # или между ними! и путь к интерпретатору.

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

Внимание!!!

Не следует учиться программировать на bash из-под пользователя root ! В противном случае - может случиться все что угодно! Я не буду нести никакой ответственности, если вы случайно допустите ошибку и испортите вашу систему. Вы предупреждены! Используйте учетную запись обычного пользователя без каких-либо привилегий. Вы можете даже создать нового пользователя только для обучения написанию сценариев. Таким образом, худшее, что произойдет в данном случае — это исчезновение данных в каталоге этого пользователя.

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

Ваша первая программа на Bash

Нашей первой программой будет классическая «Hello World». Конечно, если уже вы программировали раньше, вы должно быть устали от таких примеров. Однако это - традиция и кто я такой, чтобы менять ее? Программа «Hello World» просто выводит слова «Hello World» на экран. Запустите текстовый редактор и наберите в нем следующее:

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

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

#!/bin/bash
echo "Hello World"

Первая строка сообщает Linux использовать интерпретатор bash для запуска этого скрипта. В этом случае, bash находится в каталоге /bin. Если у вас bash находится где-то еще, сделайте соответствующие изменения в данной строке. Явное указание интерпретатора очень важно, удостоверьтесь еще раз, что указали его, поскольку данная строка говорит Linux какой именно интерпретатор нужно использовать для выполнения инструкций в скрипте. Следующее, что нужно сделать, это сохранить скрипт. Назовем его hello.sh. После этого вам нужно сделать скрипт исполняемым:

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

  • Переменные - временно хранить данные для последующего использования.
  • Арифметика.
Этот учебник организован как таковой, причем каждый раздел основывается на знаниях и навыках, изученных в предыдущих разделах.

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

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

$ chmod u+x hello.sh

Если вы не понимаете, что делает эта команда, прочтите справочную страницу команды chmod:

$ man chmod

Как только это будет сделано, вы сможете запустить программу, просто набрав ее название:

$ ./hello.sh

Hello World

Получилось! Это ваша первая программа! И хотя она скучная и не делает ничего полезного, она показывает как именно все работает. Просто запомните эту простую последовательность действий: напишите код, сохраните файл, сделайте его исполняемым с помощью chmod и запустите.

Решение проблем и творческое мышление

Чем дальше вы это примете, тем лучше вы это сделаете. Этот сайт также разработан, чтобы хорошо работать на планшетах. Если это вы, то этот сайт хорошо работает с этой настройкой. Другим хорошим подходом является наличие вашего браузера на одной половине экрана вашего компьютера и терминала на другой половине, чтобы вы могли попробовать примеры, когда идете. Всякий раз, когда вы видите, это означает, что вы должны заменить это чем-то полезным. Если вы видите что-то такое, как тогда, то обычно это означает замену этого числом. Когда вы запускаете команду, вы можете вставить что-то или оставить ее. Замените все это. . Вот несколько основных указателей, которые помогут вам в этом.

Команды, команды и команды

Что именно делает ваша первая программа? Она печатает на экран слова «Hello World». Каким образом она это делает? Она использует команды. В нашей программе мы написали только одну команду - echo «Hello World». Что именно тут команда? echo. Эта программа принимает один аргумент и печатает его на экран.

Аргументом является все, что следует после ввода названия программы. В нашем случае «Hello World» это и есть аргумент, переданный команде echo. При вводе команды ls /home/, аргументом команды ls является /home. Ну и что это все означает? А означает это то, что если у вас есть программа, которая принимает какой-то аргумент и выводит что-то на экран, вы можете использовать ее вместо echo. Предположим, что у нас есть программа под названием foo. Эта программа будет принимать один аргумент (строку из слов) и печатать их на экран. Тогда мы можем переписать нашу программу вот так:

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

  • Это даст вам гораздо лучшее представление о том, как они работают.
  • Не останавливайся!
Это то, что мне очень нравится.

#!/bin/bash
foo
" Hello World "

Сохраните ее, сделайте исполняемой и перезапустите ее (примечание для новичков - этот пример работать не будет. - Прим. перев. ):

$ ./hello
Hello World

Точно такой же результат. Использовался ли тут какой-то уникальный код? Нет. Написали ли мы какую-то программу? Нет, если только вы не являетесь автором программы echo. Все, что вы сделали - просто встроили программу echo в наш скрипт и снабдили ее аргументом. Примером альтернативы использования команды echo в реальном программировании является команда printf, которая имеет больше возможностей, если вы знакомы с программированием на C. Ну и на самом деле, точно такой же результат можно было бы получить и без написания скрипта:

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

Домашние директории других пользователей

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

$ echo "Hello World”
Hello World

Написание скриптов на bash предлагает широкий спектр возможностей и этому легко научиться. Как вы только что могли видеть, вы используете другие команды Linux, чтобы писать ваши собственные скрипты. Ваша программа-оболочка представляет собой несколько других программ, собранных вместе для выполнения какой-либо задачи.

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

Другие полезные программы

Сейчас мы напишем программу, которая переместит все файлы в каталог, удалит его вместе с содержимым, а затем создаст это каталог заново. Это может быть сделано с помощью следующих команд (В примере, приведенном в оригинале автор показывает, что не зря рекомендовал делать приведенные упражнения под специально созданным пользователем. Результатом выполнения данной последовательности команд будет чистый каталог, в котором вы работаете. Скорее всего это будет ваша домашняя директория. Поэтому, если вы НЕ хотите удаления всех файлов в ней - НЕ выполняйте команды из оригинала статьи . А лучше последуйте совету автора и создайте отдельного пользователя специально для тренировки написания скриптов. Этот пример я немного расширил и теперь он не такой опасный . Прим. перев. ):

Он показывает вам, как завершать многострочные операции в одном файле, внедрять управления потоком и взаимодействовать с пользователями, чтобы получить вход. Кроме того, он предлагает проблемы на пути, которые позволяют вам поставить то, что вы узнали в тесте. Работа с числами, строками и массивами. Чтение и запись текстовых файлов. Работа с циклами. Использование функций. Ввод данных пользователя во время выполнения. Обеспечение ответа. Что такое Баш? . Вы увидите, как работать с переменными, числами и структурами управления.

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

$ touch file1

$ mkdir trash
$ mv
file1 trash
$ rm -rf trash
$ mkdir trash

Вместо того, чтобы вводить это все в интерактивном режиме, напишем скрипт, выполняющий эти команды:

#!/bin/bash

touch file1
mkdir trash
mv
file1 trash
rm -rf trash
mkdir trash
echo “
Ф айл удален!

Хранение сервисов, нет

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

  • Это утечка ресурсов и может также иметь последствия для безопасности.
  • Есть проблемы ремонтопригодности.
Есть еще одна ситуация, когда выходная ловушка очень полезна: если ваш сценарий инициирует дорогостоящий ресурс, необходимый только во время выполнения скрипта, и вы хотите удостовериться, что он освобождает этот ресурс после его завершения.

Сохраните его под именем clean.sh и теперь все, что нужно сделать - это запустить его. Он переместит все файлы в каталог, удалит его, создаст его заново каталог и даже напечатает сообщение об удалении файлов. Запомните, если вы обнаружите, что регулярно делаете нечто требующее набора одной и той же последовательности команд - это вполне можно автоматизировать написанием скрипта.

Комментарии

Комментарии помогают сделать ваш код более читабельным. Они не влияют на то, что выводит программа. Они написаны специально для того, чтобы вы их прочли. Все комментарии в Bash начинаются с хэш-символа #, за исключением первой строки (#!/bin/bash), имеющей специальное назначение. Первая строка - не комментарий. Возьмем для примера следующий код:

#!/bin/bash
# Эта программа считает от 1 до 10:
for i in 1 2 3 4 5 6 7 8 9 10; do
echo $i
done

Даже если вы пока не понимаете скрипты на Bash, вы сразу же поймете, что делает приведенный выше пример, благодаря комментарию. Комментирование кода - хорошая практика. Со временем вы поймете, что, если вам нужно будет поддерживать ваши скрипты, то при наличии комментированного кода - делать это станет легче.

Переменные

Переменные это просто «контейнеры», которые содержат некоторые значения. Создавать их нужно по многим причинам. Вам нужно будет как-то сохранять вводимые пользователем данные, аргументы или числовые величины. Например:

#!/bin/bash
x=12
echo ”
Значение переменной x - $x”

Здесь мы присвоили переменной x значение 12. Строка echo “Значение переменной х - $x” напечатает текущее значение x. При определении переменной не допускается наличие каких-то пробелов между именем переменной и оператором присваивания: "=". Синтаксис следующий:

#!/bin/bash
echo "Значение х - 12".
echo "У меня есть 12 карандашей".
echo "Он сказал мне, что значение х равно 12".
echo "Мне 12 лет."
echo "Как получилось, что значение х равно 12?
"

Хорошо, теперь предположим, что вы решите поменять значение х на 8 вместо 12. Что для этого нужно сделать? Вы должны изменить все строки кода, в которых говорится, что х равно 12. Но погодите... Есть другие строки кода, где упоминается это число, поэтому простую автозамену использовать не получится. Теперь приведем аналогичный пример, только с использованием переменных:

#!/bin/bash
x=12 #
задаем переменной х значение 12
echo "
З начение х = $х"
echo "У меня есть 12 карандашей"
echo "Он сказал мне, что значение х
равно $х"
echo "Мне 12 лет"

echo "Как получилось, что значение х равно $ x ?"

Здесь мы видим, что $x выводит текущее значение переменной х равное 12. Поэтому теперь, если вы хотите задать новое значение х равное 8, то все что вам нужно сделать, это изменить одну строчку с х=12 на х=8, и в выводе все строки с упоминанием x также изменяться. Поэтому вам не нужно руками модифицировать остальные строки. Как вы увидите позже, переменные имеют и другие способы применения.

если /etc/foo существует, то
скопировать /etc/
foo в текущую директорию

напечатать "Готово" на экране
в противном случае,
напечатать на экране "Этот файл не существует"

выход

Можно ли это сделать в Bash? Конечно! Набор управляющих операторов Bash включает в себя: if, while, until, for и case. Каждый из этих операторов является парным, то есть начинается он одним тегом и заканчивается другим. Например, если условный оператор if начинается с if и заканчивается fi. Управляющие операторы - это не отдельные программы в системе, они встроены в bash.

if … else … elif … fi

Это один из наиболее распространенных операторов. Он позволяет программе принимать решения следующим образом - «если условие верно - делаем одно, если нет - делаем что-то другое». Чтобы эффективно его использовать, сначала нужно научиться пользоваться командой test. Эта программа выполняет проверку условия (например, существует ли файл, есть ли необходимые права доступа). Вот переписанный вариант bar.sh:

#!/bin/bash
if test -f /etc/foo
then
# Файл существует, копируем его и печатаем сообщение на экране
cp /etc/foo .
echo "Готово".
else # Файл не существует, поэтому мы печатаем сообщение

# и завершаем работу
echo "Этот файл не существует."
exit

fi

Обратите внимание на отступы строки после then и else. Они не являются обязательными, но зато делают чтение кода гораздо более простым в том смысле, что делают логику программы более наглядной. Теперь запустите программу. Если у вас есть файл /etc/foo - он будет скопирован, в противном случае будет напечатано сообщение об ошибке. Команда test проверяет существование файла. Ключ -f проверяет, является ли аргумент обычным файлом. Ниже приведен список опций test (Не стоит пытаться запомнить их все, т.к. это все равно нереально. Его всегда можно посмотреть в руководстве команды test - man test. Прим. перев. ):

Ключи команды test:

D проверяет наличие файла и то, что он является каталогом

E проверяет существование файла

Например, код:

if test -f /etc/foo
then

Можно записать вот так:

if [ -f /etc/foo ]; then

Квадратные скобки - это еще один вариант записи test. Если у вас есть опыт в программировании на C, этот синтаксис для вас может быть более удобным. Обратите внимание на наличие пробелов до и после каждой из скобок (Наличие пробелов объясняется просто: открывающая квадратная скобка - это команда оболочки. В этом можно легко убедиться набрав в консоли команду which [ . А раз это отдельная команда, то ее нужно отделить пробелами от остальных опций. - Прим. перев. ). Точка с запятой: ";" говорит оболочке о завершении одного оператора и начале следующего. Все, что находится после этого символа будет работать так, как будто он находится на отдельной строке. Это делает код более удобным для чтения и, естественно, что такая запись необязательна. Если вы предпочитаете другой вариант записи - then можно сразу поместить в другой строке.

#!/bin/bash
while:; do
echo "Нажмите CTRL-C для выхода."
done

Это позволяет добиться точно такого же эффекта, но быстрее, потому что «:» - это встроенная функция bash. Единственное отличие состоит в принесении в жертву читабельности кода. Используйте из приведенных вариантов тот, который вам нравится больше. Ниже приведен гораздо более полезный вариант использования переменных:

#!/bin/bash
x=0;
while [ "$x" -le 10 ]; do
echo "Текущее значение х: $ х"
# Увеличиваем значение х:
x=$(expr $x + 1)
sleep 1
done

Здесь мы используем для проверки состояния переменной x запись с квадратными скобками. Опция -le означает «меньше или равно (less or equal)». Говоря обычным языком приведенный код говорит: «пока (while) х меньше или равен 10, выводить на экран текущее значение х, после чего добавлять к текущему значению х единицу». Оператор sleep 1 приостанавливает выполнение программы на одну секунду.

Ниже приведен список возможных операций сравнения целых чисел (полный список приведен в man test. Прим. перев. ):

x -eq y x = y (equal)

x -ne y x не равен y (not equal)

x -gt y x больше, либо равен y (greater than)

x -lt y x меньше, либо равен y (lesser than)

Операторы сравнения строк:

x = y строка x идентична y

x != y строка х не совпадает y

N x выражение истинно, если строка х ненулевой длины

Z x выражение истинно, если строка х имеет нулевую длину

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

x=$(expr $x + 1)

Прочитав эту статью, вы узнаете что такое bash (стандартный командный интерпретатор линукс), научитесь обращаться со стандартными командами: ls , cp , mv ... поймете назначение инодов, жестких и символических ссылок и многое другое.

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

Введение в bash

Shell

Если вы используете линукс, то знаете что после логина вас приветствует приглашение командного интерпретатора. Например такое:

\$

Если после логина загружается графическая оболочка, то чтобы добраться до командного интерпретатора нужно запустить эмулятор терминала (gnome-terminal, xfce4-terminal, konsole, xterm, rxvt...) или переключиться на один из виртуальных терминалов нажав Ctrl Alt F1 или Ctrl Alt F2 и т.д.

Приглашение командного интерпретатора на вашем компьютере может отличаться от того что показано в примере. Оно может содержать имя пользователя, имя компьютера и название текущей рабочей директории. Но несмотря на все эти различия, программа которая печатает это приглашение называется "shell " (оболочка), и скорее всего в роли вашей командной оболочки выступает программа которая называется bash .

У вас запущен bash?

Проверить запущен ли bash можно следующей командой:

\$ echo \$SHELL /bin/bash

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

\$ bash

Что такое bash

Bash (акроним от "B ourne-a gain SH ell") это стандартный интерпретатор команд на большинстве линукс систем. В его обязанности входит обработка и исполнение команд с помощью которых пользователь управляет компьютером. После того как вы завершили работу, можно завершить процесс командного интерпретатора. После нажатия клавиш Ctrl D , команд exit или logout процесс командного интерпретатора будет завершен и на экране снова появится приглашение ввести имя пользователя и пароль.

Использование "cd"

Давайте начнем использовать bash для навигации по файловой системе. Для начала напечатайте следующую команду:

$ cd /

Этой командой мы указали bash-у что хотим переместиться в корневую директорию - / . Все директории в системе организованы в древовидную структуру и / это её начало (или корень). Команда cd служит для изменения текущей рабочей директории.

Пути

Чтобы узнать в каком месте файловой системы в данный момент вы находитесь (текущую рабочую директорию) наберите:

\$ pwd /

В приведенном выше примере / - аргумент команды cd - называется путь . Это место файловой системы, куда мы хотим переместиться. В данном случае / - абсолютный путь, это значит что путь указан относительно корневой директории.

Абсолютные пути

Вот несколько примеров абсолютных путей

/dev /usr /usr/bin /usr/local/bin

Как вы уже могли заметить, все эти пути объединяет то, что они начинаются с / . Указывая путь /usr/local/bin в качестве аргумента команде cd мы говорим ей перейти в корневую директорию / , затем в директорию usr, потом в local и bin. Абсолютные пути всегда начинаются с /

Относительные пути

Второй вид путей называется относительными. Bash , команда cd и другие команды отсчитывают эти пути относительно текущей директории. Относительные пути никогда не начинаются с / . Например, если мы находимся в /usr

\$ cd /usr

Затем мы можем перейти в /usr/local/bin используя относительный путь

\$ cd local/bin \$ pwd /usr/local/bin

Использование ".."

Относительные пути могут содержать одну или несколько директорий ".." . ".." указывает на родительскую директорию по отношению к нашей рабочей директории. Пример:

\$ pwd /usr/local/bin \$ cd .. \$ pwd /usr/local

Как вы видите, команда cd .. "поднимает нас на уровень выше".

Можно добавить .. к относительному пути. Это позволит переместиться в директорию, которая находится на одном уровне с той в которой мы находимся. Пример:

\$ pwd /usr/local \$ cd ../share \$ pwd /usr/share

Примеры с использованием относительных путей

Относительные пути могут быть довольно сложными. Вот несколько примеров. Результат выполнения команд не показан, попробуйте определить в какой директории вы окажетесь используя bash.

\$ cd /bin \$ cd ../usr/share/zoneinfo \$ cd /usr/X11R6/bin \$ cd ../lib/X11 \$ cd /usr/bin \$ cd ../bin/../bin

Рабочая директория "."

Перед тем как закончить разговор о команде cd , следует упомянуть еще несколько вещей. Во-первых, существует ещё одна специальная директория "." , которая указывает на текущую директорию. Эта директория используется для запуска исполняемых файлов, находящихся в текущей директории.

\$ ./myprog

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

cd и домашняя директория пользователя

Для того чтобы перейти в домашнюю директорию, нужно набрать

\$ cd

Без аргумента cd переместит вас в домашнюю директорию. Для суперпользователя домашней обычно является директория /root, а для обычных пользователей - /home/username/. Но что если мы хотим указать конкретный файл, находящийся в домашней директории. Например, как аргумент к программе "myprog" ? Можно написать:

\$ ./myprog /home/user/myfile.txt

Однако, использовать абсолютные пути к файлам не всегда удобно. Эту же операцию можно сделать при помощи ~ –тильды:

\$ ./myprog ~/myfile.txt

~ - специальное имя, указывающее в bash на домашнюю директорию пользователя.

Домашние директории других пользователей

Но что если нам нужно указать файл в домашней директории другого пользователя? Для этого после тильды нужно указать имя этого пользователя. Например, чтобы указать на файл fredsfile.txt находящийся в домашней директории пользователя fred:

\$ ./myprog ~fred/fredsfile.txt

Команды линукс

Введение в ls

Вероятно вы уже знакомы с командой ls , которая, вызванная без аргументов, выводит на экран список файлов хранящихся в рабочей директории:

\$ cd /usr \$ ls X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info local portage.old src

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

\$ ls -a . bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info local portage.old src X11R6 doc i686-pc-linux-gnu lib man sbin ssl

Подробный список директорий

После самой команды ls в качестве ее аргумента можно указать один или более файлов или директорий. Если указать имя файла, то команда ls выведет информацию только об этом файле. А если указать название директории, ls покажет все ее содержимое. Опция "-l" команды ls бывает очень полезной если вы хотите кроме имен файлов узнать более подробную информацию о них (права на файл, имя владельца, время последнего изменения файла и его размер).

В следующем примере показано применение опции "-l" для вывода информации о файлах хранящихся в директории /usr

\$ ls -l /usr drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc drwxr-xr-x 62 root root 1856 Dec 27 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 Dec 12 23:10 i686-linux drwxr-xr-x 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Dec 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info drwxr-xr-x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrwxrwxrwx 1 root root 9 Dec 22 20:57 man -> share/man lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old drwxr-xr-x 3 root root 3096 Dec 22 20:57 sbin drwxr-xr-x 46 root root 1144 Dec 24 15:32 share drwxr-xr-x 8 root root 328 Dec 26 00:07 src drwxr-xr-x 6 root root 176 Nov 24 14:25 ssl lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/tmp

В первой колонке показана информация о правах доступа к каждому файлу в списке. (Немного позже я объясню какая буква что обозначает) Следующая колонка показывает количество ссылок на каждый элемент списка. Третья и четвертая колонки - владелец и группа файла соответственно. Пятая колонка - размер. Шестая - время последнего изменения файла ("last modified time" или mtime). Последняя колонка - имя файла или директории (Если это ссылка, то после знака "–> " стоит имя объекта на который она ссылается).

Как посмотреть только директории

Иногда возникает потребность посмотреть информацию только о директориях, а не о всем их содержимом. С этой задачей поможет справиться опция "-d" , которая указывает команде выводить информацию только о директориях. Пример:

\$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share drwxr-xr-x 4 root root 96 Dec 18 18:17 ../share drwxr-xr-x 17 root root 576 Dec 24 09:03 /usr drwxr-xr-x 2 root root 3192 Dec 26 12:52 /usr/X11R6/bin drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin

Рекурсивный список и информация о инодах

Действие опции "-R" противоположно действию "-d" . Она позволяет выводить информацию о файлах находящихся в директории рекурсивно. Сначала показывается содержимое директории верхнего уровня, потом по очереди содержимое всех поддиректорий и так далее. Вывод этой команды может быть достаточно объемным, поэтому мы не приводим ее пример, но вы можете попробовать сделать это самостоятельно, набрав в командной строке "ls -R " или "ls -Rl ".

И, наконец, опция "-i" используется для вывода инодов каждого объекта файловой системы.

\$ ls -i /usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 include 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp

Что такое иноды?

Каждый объект файловой системы (файл, директория...) имеет свой уникальный номер, называемый инодом (inode number). Эта информация может показаться незначительной, но понимание функции инодов поможет вам разобраться во многих операциях над файловой системой. Например, посмотрим на "." и ".." как на ссылки, присутствующие в каждой директории. Чтобы понять что из себя представляет директория ".." , узнаем инод директории /use/local

\$ ls -id /usr/local 5120 /usr/local

Как можем видеть, инод директории /usr/local - 5120. Теперь посмотрим какой инод у директории /usr/local/bin/..:

\$ ls -id /usr/local/bin/.. 5120 /usr/local/bin/..

Получается, что иноды директорий /usr/local и /usr/local/bin/.. совпадают! Это значит, что на инод 5120 ссылаются два имени: /usr/local и /usr/local/bin/.. То есть это два разных имени одной директории. Каждый инод указывает на определенное место на диске.

С каждым инодом может быть связано несколько имен объектов файловой системы. Количество "синонимов" файла (объектов файловой системы, ссылающихся на один инод) показывает число во втором столбце вывода команды "ls -l ".

\$ ls -dl /usr/local drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local

На этом примере видно (второй столбец), что на директорию /usr/local ссылаются 8 разных объектов файловой системы. Вот их имена:

/usr/local /usr/local/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/src/..

mkdir

Давайте рассмотрим команду mkdir . Она служит для создания новых директорий. В следующем примере демонстрируется создание трех новых директорий (tic, tac, toe) в директории /tmp

\$ cd /tmp $ mkdir tic tac toe

По умолчанию команда mkdir не может создать вложенной структуры директорий. Поэтому, если вам нужно создать несколько вложенных одна в другую директорий (won/der/ful ), то вам придется три раза поочередно вызывать эту команду:

\$ mkdir won/der/ful mkdir: cannot create directory "won/der/ful": No such file or directory \$ mkdir won \$ mkdir won/der \$ mkdir won/der/ful

Упростить эту операцию можно добавив опцию "-p" к команде mkdir. Эта опция позволяет создавать вложенную структуру директорий:

\$ mkdir -p easy/as/pie

Чтобы узнать о возможностях этой утилиты подробнее, прочитайте справку, которая вызывается командой man mkdir . Справки есть практически ко всем командам из этого руководства (например man ls ), кроме cd , т.к. она встроена в bash (для таких команд справка вызывается так: help cd )

touch

Перейдем к изучению команд cp и mv , служащих для копирования, переименования и перемещения файлов и директорий. Но перед этим создадим пустой файл в директории /tmp при помощи команды touch :

\$ cd /tmp \$ touch copyme

Команда touch обновляет время последнего доступа к файлу (шестая колонка вывода команды ls -l ) если он уже существует или создает новый пустой файл, если его ещё нету. После этой операции у нас должен появиться пустой файл /tmp/copyme .

echo

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

\$ echo "firstfile" firstfile

Чтобы записать строку в наш файл, перенаправим в него вывод команды echo :

\$ echo "firstfile" > copyme

Знак > (больше) указывает командной оболочке что нужно перенаправить вывод команды стоящей слева в файл, имя которого находится справа. Если файла с таким именем не существует, он будет создан автоматически. А если такой файл уже есть, то он будет перезаписан (все его содержимое будет стерто перед записью нашей строки). Команда "ls -l" покажет что размер нашего файла теперь равен 10 байтам - девять байт занимает слово "firstfile" и один байт символ перевода строки.

\$ ls -l copyme -rw-r--r-- 1 root root 10 Dec 28 14:13 copyme

cat и cp

Для вывода содержимого файла на терминал используется команда cat :

\$ cat copyme firstfile

Теперь мы можем приступить к разбору базовой функциональности команды cp . Эта команда принимает два аргумента. Первый - имя уже существующего файла ("copyme"), второй - название новой копии, которую мы хотим сделать ("copiedme").

\$ cp copyme copiedme

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

\$ ls -i copyme copiedme 648284 copiedme 650704 copyme

mv

Теперь применим команду mv чтобы переименовать файл ("copiedme" –> "movedme"). Номер инода после этой операции не меняется, а изменяется только название файла.

\$ mv copiedme movedme \$ ls -i movedme 648284 movedme

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

Команда mv позволяет не только переименовывать файлы, но и перемещать их. Например, чтобы переместить файл /var/tmp/myfile.txt в директорию /home/user нужно дать команду:

\$ mv /var/tmp/myfile.txt /home/user

Файл будет перемещен в домашнюю директорию пользователя user даже если она находится в другой файловой системе (в этом случае файл будет скопирован в новое место после чего оригинал будет удален). Как вы могли уже догадаться, перемещение файла в другую файловую систему приводит к изменению его инода. Это происходит потому, что каждая файловая система имеет свой отдельный набор инодов.

Нужно заметить, существует вероятность, что новый присвоенный номер инода может совпасть со старым, но она чрезвычайно мала.

Чтобы переместить одновременно несколько файлов в одну директорию нужно написать:

\$ mv /var/tmp/myfile1.txt /var/tmp/myfile2.txt /home/user \$ mv -t /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt

Если добавить опцию "-v" , на экран будет выведен отчет о проделанной операции:

\$ mv -vt /home/user /var/tmp/myfile1.txt /var/tmp/myfile2.txt "/var/tmp/myfile1.txt" -> "/home/user/myfile1.txt" "/var/tmp/myfile2.txt" -> "/home/user/myfile2.txt"

Создание ссылок и удаление файлов

Жесткие ссылки

Я уже упоминал слово "ссылка" когда говорил о директориях и инодах. На самом деле в линуксе существует два вида ссылок. Первый вид называют жесткими ссылками. Каждый инод может иметь несколько связанных с ним жестких ссылок. Таким образом, получается что файл присутствует в системе под несколькими разными именами. Файл существует до тех пор, пока с его инодом связано хотя бы одно имя. Понятия «жёсткая ссылка на файл» и «имя файла» являются синонимами. Новые жесткие ссылки на файл можно сделать при помощи команды ln

\$ cd /tmp \$ touch firstlink \$ ln firstlink secondlink \$ ls -i firstlink secondlink 15782 firstlink 15782 secondlink

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

Символические ссылки

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

Симлинки создаются командой ln с опцией "-s" :

\$ ln -s secondlink thirdlink \$ ls -l firstlink secondlink thirdlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink

Символическую ссылку можно распознать по выводу команды ls -l : во-первых, в первой колонке у симлинков стоит буква "l" (первая буква английского слова link–ссылка), во-вторых, размер симлинка равен количеству букв в имени файла на который он ссылается ("secondlink" в нашем случае), в-третьих, последняя колонка помимо имени ссылки содержит имя файла на который она ссылается после знака –>

Подробнее о симлинках

Рассмотрим ситуацию, когда мы хотим сделать симлинк который указывает на /usr/local/bin и находится в директории /tmp/. Мы можем написать:

\$ ln -s /usr/local/bin bin1 \$ ls -l bin1 lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin \$ ln -s ../usr/local/bin bin2 \$ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin \$ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin \$ mkdir mynewdir \$ mv bin2 mynewdir \$ cd mynewdir \$ cd bin2 bash: cd: bin2: No such file or directory

Так как не существует директории /tmp/usr/local/bin/, мы не сможем сменить рабочую директорию на bin2; другими словами, после перемещения ссылка перестала работать (стала "битой").

По этой причине, иногда стоит избегать создания симлинков, используя относительные пути. Но иногда это бывает удобно. Рассмотрим такой случай: допустим мы хотим сделать ссылку на программу в /usr/bin (или другими словами присвоить этой программе альтернативное имя):

# ls -l /usr/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

Суперпользователь (root) может захотеть сделать ссылку на программу "keychain" с более коротким именем "kc". В этом примере у нас есть рутовый доступ к системе, о чем свидетельствует приглашение bash, изменившееся на "#" . Нам нужны права суперпользователя потому, что обычные пользователи не могут создавать файлы в директории /usr/bin/. Теперь мы можем от имени рута создать альтернативное имя для нашей программы:

# cd /usr/bin # ln -s /usr/bin/keychain kc # ls -l keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain # ls -l kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

В этом примере мы создали симлинк kc ссылающийся на файл /usr/bin/keychain.

# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

Из-за того что мы использовали абсолютный путь при создании ссылки, она продолжает указывать на файл /usr/bin/keychain, которого больше нет. Но если бы мы использовали относительный путь при создании ссылки, она бы осталась рабочей.

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

# cd /usr/bin # ln -s keychain kc # ls -l kc lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain # mv keychain kc /usr/local/bin # ls -l /usr/local/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain

Теперь мы можем запускать программу "keychain", обратившись к ней по имени /usr/local/bin/kc

rm

Теперь когда мы знаем как работают команды cp , mv и ln пришло время узнать как удалять файлы. Обычно, удаление производится при помощи команды rm . Чтобы удалить несколько файлов, просто укажите их имена через пробел в командной строке как аргументы rm :

\$ cd /tmp \$ touch file1 file2 \$ ls -l file1 file2 -rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2 \$ rm file1 file2 \$ ls -l file1 file2 ls: file1: No such file or directory ls: file2: No such file or directory

Помните, что удаленные файлы невозможно восстановить (хотя можно попробовать). Поэтому многие начинающие пользователи линукс используют опцию "-i" команды rm , которая требует запрашивать у пользователя подтверждение удаления каждого файла.

\$ rm -i file1 file2 rm: remove regular empty file `file1"? y rm: remove regular empty file `file2"? y

В последнем примере перед удалением каждого файла команда rm спрашивает: действительно ли пользователь хочет удалить файл? Чтобы подтвердить удаление, нудно нажать клавишу "y" на клавиатуре, а чтобы отказаться от удаления - клавишу "n" .

Прервать выполнение любой команды (если что-то пошло не так как задумывалось) можно нажав комбинацию Ctrl C .

Сделать так, чтобы команда rm запрашивала подтверждение на удаление каждого файла даже без опции "-i" можно добавив в файл ~/.bashrc с помощью любимого текстового редактора строку:

alias rm="rm -i"

rmdir

Есть два способа удаления директорий: можно поочередно удалить все содержимое директории, а потом использовать команду rmdir для удаления самой директории:

\$ mkdir mydir \$ touch mydir/file1 \$ rm mydir/file1 \$ rmdir mydir

Этот способ обычно называют "метод удаления директорий для неудачников". Намного удобнее использовать команду "rm -rf" для удаления директории со всем ее содержимым.

\$ rm -rf mydir

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

Использование wildcards

Что такое wildcards

При повседневном использовании линукса часто возникают ситуации когда нужно выполнить одну простую операцию (например rm) над множеством файлов. В этом случае не очень то удобно перечислять все имена файлов в командной строке:

\$ rm file1 file2 file3 file4 file5 file6 file7 file8

Решить эту проблему можно при помощи шаблонов замены (wildcards). Командный интерпретатор линукс поддерживает возможность указания множества файлов используя шаблоны (по историческим причинам это еще называют "globbing"). Bash и другие команды линукс выбирают только те файлы, которые совпадают с шаблоном. Так, если вам нужно удалить файлы с file1 по file8, нужно написать:

\$ rm file

А если нужно удалить все файлы имена которых начинаются со слова file и файл с именем file:

\$ rm file*

Шаблон * соответствует любому символу, последовательности символов или "отсутствию символа". Конечно, шаблоны можно применять не только для удаления файлов, как будет показано ниже.

Если совпадение не найдено

Если вы хотите вывести список файлов в директории /etc/ имена которых начинаются с буквы "g" и файл с именем "g" (если такой существует), нужно написать:

\$ ls -d /etc/g* /etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-

Посмотрим что случится если вы укажете шаблон который не совпадает ни с одним именем файла:

\$ ls -d /usr/bin/asdf*jkl ls: /usr/bin/asdf*jkl: No such file or directory

В этом примере мы попытались вывести список файлов имена которых начинаются на "asdf" и заканчиваются на "jkl". Интерпретатор команд выдал сообщение что файлов с такими именами не найдено.

Синтаксис шаблона: * и?

Мы посмотрели как работает глоббинг (подстановка имен файлов). А теперь рассмотрим подробнее синтаксис шаблонов:

* соответствует нулю или большему количеству символов:

  • /etc/g* - все файлы в директории /etc/ имена которых начинаются с "g" и файл с именем "g".
  • /tmp/my*1 - все файлы в директории /tmp имена которых начинаются с "my" и заканчиваются на "1" (включая файл с именем "my1")

? заменяет один любой символ:

  • myfile? - любой файл чье имя начинается со слова "myfile" за которым следует один любой символ.
  • /tmp/notes?txt - соответствует файлам с именами "notes.txt" и "notes_txt" (если они существуют в /tmp/).

Квадратные скобки:

Шаблон "" очень похож на "? " но позволяет явно указывать набор символов. Шаблон "" совпадает с одним символом из тех что указаны в скобках. Также в скобках можно указать диапазон символов (для этого используется символ –/дефис) или несколько диапазонов подряд, тогда шаблон будет совпадать с одним любым символом из этого диапазона:

  • myfile - соответствует myfile1 и myfile2. Шаблон будет работать пока существует хотя бы один из этих двух файлов.
  • hangeog - соответствует файлам с именами Changelog, ChangeLog, changeLog, и changelog. Как вы могли заметить, использование шаблона полезно при поиске имен отличающихся регистром букв.
  • ls /etc/* - вывести список файлов в директории /etc/ имена которых начинаются с цифры.
  • ls /tmp/* - вывести список файлов в директории /tmp/ имена которых начинаются с буквы (заглавной или прописной)

Конструкция [ похожа на , за исключением того что она соответствует единичному символу, не упомянутому между [[ и ] . Например:

  • rm myfile[ - удалит все файлы, имена которых состоят из слова "myfile" и идущей за ним одной цифрой, кроме файла "myfile9".

Примеры использования

Вот несколько примеров использования шаблонов. Так как bash интерпретирует символы ? , [ , ] , * как шаблоны замены, необходимо принять меры предосторожности при использовании аргументов содержащих эти символы. Например, если вы хотите создать файл содержащий строку "* ", то следующая команда сделает не то что вы хотите:

\$ echo * > /tmp/mynewfile.txt

Если в вашей рабочей директории найдется один или несколько файлов, имена которых попадают под шаблон "* ", то вы обнаружите в /tmp/mynewfile.txt список их имен, а не строку "* ". Но как же добиться того чего мы хотели? Первый способ - это взять строку в одинарные кавычки. К строке в одинарных кавычках bash относится как к обычной текстовой строке и не раскрывает символы замены.

\$ echo "*" > /tmp/mynewfile.txt

После выполнения этой команды ваш файл будет содержать строку "* " как и ожидалось. Другой способ - заэкранировать спец.символы с помощью обратного слэша (\ ). Бэкслэш стоящий перед спец.символом сообщает интерпретатору, что этот символ нужно рассматривать как обычный текст а не как шаблон.

\$ echo \\* > /tmp/mynewfile.txt

Оба предложенных метода (одинарные кавычки и экранирование) дают желаемый результат. Раз уж мы заговорили об экранировании при помощи обратного слэша, стоит сказать, что чтобы указать текстовый символ "\" можно заключить его в одинарные кавычки или написать "\\\" (эта комбинация будет воспринята интерпретатором как обычный одинарный бэкслэш "\" )

Замечание : Двойные кавычки работаю почти так же как и одинарные, но позволяют bash-у интерпретировать некоторые спец.символы. Поэтому одинарные кавычки - лучший способ передать команде только текст. Для дополнительной информации о шаблонах читайте справку "man 7 glob" . Для дополнительной информации об использовании кавычек, читайте раздел QUOTING справки "man 8 glob" .

Заключение

Поздравляю, вы добрались до конца нашего обзора основ линукс! Надеюсь, материал оказался вам полезен. Темы, разобранные в этом пособии, включая основы bash, основные команды linux, ссылки и wildcards являются основой для следующей статьи об основах администрирования, в которой будет рассказано о регулярных выражениях, правах доступа, управлении аккаунтами пользователей и многом другом.