Командный язык shell
Язык программирования shell имеет несколько конструкций, которые придадут гибкость вашим программам:
- комметнарии позволят описывать функции программы;
- "here document" позволяет вам включать в shell программы строки, которые будут перенаправляться как ввод в некоторые команды shell программы;
- команда exit позволяет завершать программу в нужной точке и использовать коды возврата;
- конструкции цикла for, while позволяют повторять группу команд в цикле;
- условные команды if и case выполняют группу команд, если выполнилось некоторое условие;
- команда break позволяет выполнить безусловный выход из цикла.
9.3.1. Комментарии
Чтобы в программе разместить комментарии, воспользуйтесь знаком #. Если знак # стоит после команды, то сама команда выполняется, а комментарий игнорируется. Формат строки комментария:
#comment
9.3.2. "Here document"
"Here document" позволяет размещать в shell программе строки, которые перенаправляются в качестве ввода команды в этой программе. Это один из способов обеспечения ввода для команды в shell программе без использования отдельного файла. Запись состоит из символа перенаправления << и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.
Формат команды следующий:
Command<
9.3.3. Использование ed в shell программе
"Here document" предлагает способ использования ed в shell программе. Предположим вы хотите создать shell программу, которая будет вызывать редактор ed, проводить глобальные изменения в файле, записывать изменения в файл и затем завершать работу с ed. На следующем экране приведено содержание программы ch.text, которая выполняет эти задачи:
$ cat ch.text Обратите внимание на знак - (минус)
в команде ed. Эта опция
предотвращает распечатку счетчика
символов на экране. Обратите также
внимание на формат команды ed для
глобальной замены: G/$old_text/s//$new_text/g
Программа использует 3
переменные: file1, old_text, new_text. При
запуске эта программа использует
команду read для получения значений
этих переменных. Эти переменные
содержат следующую информацию: Переменные вводятся в программу,
here document перенаправляет команду
глобальной замены, команду записи и
команду завершения команде ed.
Запустите программу ch.text. Получите
следующий экран:
$ ch.text Большинство команд shell возвращает
коды, которые указывают, успешно ли
завершилась команда. Если
возвращаемое значение 0(ноль), то
команда выполнилась успешно. Коды
возврата не печатаются
автоматически, но их можно получить
как значение специального
параметра shell $?. После выполнения в интерактивном
режиме команды, вы можете увидеть
код завершения при вводе: Рассмотрим следующий пример:
$ cat hi
This is file hi.
$ echo $?
0
$ cat hello
cat: cannot open hello
$ echo $?
2
$
В первом случае файл hi существует
в вашем справочнике и вы имеете
разрешение на чтение. С помощью
команды cat вы можете распечатать
содержимое файла. Результат
команды cat: код возврата 0, который
вы получите, задав параметр $?. Во
втором случае файл либо не
существует, либо вы не имеете право
на чтение. Команда cat печатает
диагностическое сообщение и
возвращает код 2. shell программа нормально
завершается, когда выполнится
последняя команда в файле. Однако
вы можете использовать команду exit
для завершения программы. Более
важно то, что вы можете
использовать команду exit для
получения кодов возврата shell
программы. Операторы цикла for и while позволяют
выполнить команду или
последовательность команд
несколько раз. Оператор for выполняет
последовательность команд для
каждого элемента списка. Он имеет
формат: For variable Для каждой итерации цикла
следующий элемент списка
присваивается переменной, данной в
операторе for. Ссылка на эту
переменную может быть сделана в
любом месте в командах внутри
оператора do. При конструировании
каждой секции команд вам
необходимо убедиться, что каждому do
соответствует done в конце цикла. Переменная может иметь любое имя.
Например, если ваша переменная
названа var, то ссылка в списке
команд на $var сделает значение
доступным. Если оператор in опущен,
то значением для var будет набор
аргументов, заданный в команде и
доступный в специальном параметре
$*. Список команд между ключевым
словом do и done будет выполнен для
каждого значения. Когда команды будут выполнены для
последнего элемента списка,
программа будет выполнять строку
ниже done. Оператор цикла while использует 2
группы команд. Он будет выполнять
последовательность команд во
второй группе (список do ... done) до тех
пор пока последняя команда в первой
группе (список while) возвращает
состояние "истина",
означающее, что выражение после do
может быть выполнено. Общий формат оператора цикла
while:
While Например, программа enter.name
использует цикл while для ввода
списка имен в файл. Программа
состоит из следующих командных
строк:
$ cat enter.name Внеся некоторые добавления,
получим следующую программу:
$ cat enter.name Обратите внимание, что после
завершения цикла программа
выполняет команды ниже done. В первых двух командах echo
используются специальные символы,
так что вы должны воспользоваться
кавычками для отмены специального
значения. На следующем экране
приведены результаты выполнения
программы enter.name:
$ enter.name После того, как цикл завершится,
программа распечатает все имена,
содержащиеся в xfile. Файловая система имеет файл /dev/null,
где вы можете хранить
нежелательный вывод. Например, если
просто ввести команду who, то система
ответит, кто работает в системе.
Если вы перенаправите вывод этой
команды в /dev/null: Who > /dev/null
то не получите ответа. Оператор if ... then
Команда if говорит shell программе,
что нужно выполнить
последовательность команд после
then, если последняя команда в списке
команд конструкции if выполнилась
успешно. Конструкции if
заканчиваются ключевым словом fi. Общий формат конструкции if:
If Например, shell программа search
демонстрирует применение
конструкции if ... then. Программа search
использует команду grep для поиска
слова в файле. Если grep выполнилась
успешно, то программа отображает
найденное слово. Экран будет
выглядеть следующим образом:
$ cat search Эта программа отображает вывод
команды grep. Если вы хотите
сохранить ответ системы на команду
grep в вашей программе, то
воспользуйтесь файлом /dev/null,
изменив командную строку if на
следующую: If grep $word $file > /dev/null Теперь выполните команду search. Она
ответит только сообщением,
указанным после команды echo. Конструкция if ... then ... else может
исполнять альтернативный набор
команд, стоящий после else, в случае,
если последовательность if является
ложью. Формат этой конструкции
следующий: If С помощью этой конструкции вы
можете усовершенствовать
программу search, так что она будет
сообщать вам и найденное слово и то,
что слово не найдено. В этом случае
программа search будет выглядеть
следующим образом:
$ cat search Команда test
Команда test используется для
организации цикла. Она проверяет на
истинность определенные условия и
полезна для организации условных
конструкций. Если условие истинно,
то цикл будет продолжен. Если
условие ложно, то цикл завершится и
будет выполняться следующая
команда. Некоторые примеры
использования команды test: Test -r file Пример. Создадим shell программу,
которая перемещает все исполняемые
файлы из текущего справочника в ваш
справочник bin. Для этого
воспользуемся командой test -x для
выбора исполняемых файлов.
Программа mv.file будет выглядеть
следующим образом:
$ cat mv.file Конструкция case ... esac позволяет
выбрать вам один из несколько
шаблонов и затем выполнить список
команд для этого шаблона.
Выражение-шаблон должно начинаться
с ключевого слова in, а правая
круглая скобка должна быть
помещена после последнего символа
каждого шаблона.
Последовательность команд для
каждого шаблона заканчивается
двумя знаками;;. Конструкция case
должна быть закончена ключевым
словом esac. Общий формат конструкции case:
Case word Конструкция case пытается найти word
с шаблоном pattern в первой секции
шаблонов. Если поиск удачен, то
программа выполняет командные
строки после первого шаблона до
соответствующих знаков;;. Если первый шаблон не найден, то
осуществляется переход ко второму
шаблону. Если любой шаблон найден,
то программа не рассматривает
остальные шаблоны, а переходит к
команде, следующей за esac. Знак *
используется как шаблон для поиска
любого word и таким образом дает вам
набор команд, который будет
выполнен, если никакой другой
шаблон не будет найден. Поэтому
шаблон звездочка (*) размещается как
последний шаблон в конструкции case,
чтобы другие шаблоны были
проверены первыми. Это поможет вам
обнаружить некорректный и
неожиданный ввод. В шаблонах могут использоваться
метасимволы *, ?, . Это обеспечивает
гибкость программ. Рассмотрим пример. Программа set.term
устанавливает переменную TERM в
соответствии с типом терминала,
который вы используете.
Применяется следующая командная
строка: TERM=terminal_name Шаблон * стоит последним в списке
шаблонов. Он выдает
предупреждающее сообщение, что для
указанного типа терминала нет
соответствующего шаблона и
позволяет вам завершить
конструкцию case.
$ cat set.term Команда break безусловно
останавливает выполнение любого
цикла, в котором он встречается и
передает управление команде,
следующей после ключевых слов done, fi
или esac. В предыдущем примере программы
set.term вы можете использовать
команду break, вместо echo, чтобы выйти
из программы, как приведено в
следующем примере:
$ cat set.term Команда continue приведет к тому, что
программа немедленно перейдет к
следующей итерации цикла while или for
без выполнения остальных команд в
цикле. Любой универсальной ОС приходится много возиться с пользовательскими и своими собственными задачами. Лишь небольшая часть этой деятельности может быть запрограммирована раз и навсегда в ядре. Большая часть логики управления задачами и самой системой должна быть доступна администратору в виде проекта, иначе он просто не сможет ни понять происходящее в системе, ни тем более изменять ее. Стоит повнимательнее взглянуть на инструмент, используемый в UNIX
для задания алгоритма работы многих частей системы, - на командный интерпретатор
, shell
. Оказывается, shell
отлично себя показывает не только в диалоге с пользователем, но и как исполнитель сценариев
, и как средство организации взаимодействия
между задачами в системе. Начнем с того, что shell
- полноценный язык программирования
, причем, как многие интерпретаторы, довольно высокого уровня. Если задача - разовая (нет требований по
быстродействию, совместимости и переносимости) и достаточно абстрактная (нет привязки к конкретной сложной структуре данных), ее скорее всего можно решить, написав командный сценарий
- программу на shell
. С другой стороны, одной алгоритмической полнотой при решении задач в системе ограничиваться нельзя. Скажем, машина Тьюринга
[
9
] чрезвычайно проста и алгоритмически полна, однако мало кому придет в голову организовывать на основе ее модели диалог с пользователем или управление самой ОС. Здесь следует вспомнить, что shell
- еще и исполнитель
команд: он запросто общается с UNIX
и утилитами. Значит, дополнив его механизмом управляемого взаимодействия команд с системой и друг с другом, мы получим неплохой интегратор
(или оболочку
- что, собственно, и есть перевод слова shell
). Самое приятное, что такая программируемая оболочка
не будет слишком выходить за рамки У: если уж, в наследство от диалоговой ипостаси shell
, мы можем легко обращаться за решением подзадачи к любой
утилите UNIX
, дублировать ее в языке совершенно незачем, и там останутся как раз одни только алгоритмические и координационные абстракции. Прежде чем рассмотреть возможности shell
под двумя углами зрения, разрешим вот какое затруднение. Допустим, мы написали программу на языке какого-нибудь интерпретатора, например /bin/sh
, и записали ее в некий файл
, например /home/george/myscript
(если /home/george
- текущий каталог
, можно использовать более короткий путь
: myscript
). Как теперь выполнить этот сценарий
? Из man sh
мы знаем, что для этого можно запустить командный интерпретатор
с параметром - именем файла: $ cat myscript
echo "Hello, George!"
$ /bin/sh myscript
Hello, George! Нельзя ли обойтись без имени программы, которая интерпретирует сценарий
? Вообще говоря, нет: в UNIX
немало различных интерпретаторов с разнообразным синтаксисом, например обработчик текстов awk
, потоковый текстовый редактор
sed
, универсальные языки программирования
python
и perl
и много чего еще. Во всех этих языках есть возможность вставлять в текст сценария
строчные комментарии, которые начинаются с символа "#" и заканчиваются в конце строки. Поэтому, если сценарий
начинается с символов " #
!", любой из этих интерпретаторов проигнорирует всю первую строку как комментарий. Система же, увидев " #
!" в начале файла, понимает, что это сценарий
. С третьего символа и до конца строки она читает имя программы
, которой отдает этот файл
на выполнение. Значит, если первой строкой в /home/george/myscript
будет #!/bin/sh
, его смело можно делать исполняемым (установить бит
использования) и запускать: $ chmod +x myscript
$ cat myscript
#!/bin/sh
echo "Hello, $1!"
$ ./myscript George
Hello, George! Строго говоря, после " #
!" может стоять что угодно, например имя написанной нами программы с некоторыми обязательными параметрами; UNIX
ее запустит и передаст ей в качестве параметров командной строки
обязательные параметры (если они есть), затем имя сценария
и все, что идет следом (в нашем примере George
). Если же после " #
!" будет стоять несуществующий файл
, система выдаст сообщение об ошибке
: $ cat myscript
#!/bad/sh
echo "Hello, $1!"
$ ./myscript
./myscript: not found Обратите, пожалуйста, внимание на то, что из этого сообщения якобы следует, что не найден сам файл
сценария
. Если не знать подоплеку явления, ситуация кажется подозрительной. Дело в том, что, запуская любую программу, UNIX
всегда
передает ей один параметр
(который имеет индекс
0) - имя этой программы. Но в случае запуска сценария
обработчик получит в качестве нулевого параметра не собственное имя, а имя сценария
. А когда система этого обработчика не найдет, в сообщении об ошибке он будет упоминаться под новым именем. И еще одно немаловажное замечание. Сначала в UNIX
был только один командный интерпретатор
, написанный Стивеном Борном (Stephen Bourne), и назывался он просто "оболочка"
(т. е. shell
, а имя утилиты, для краткости, sh). Это была очень простая маленькая программа
, она отлично работала именно как системный интегратор
, но во всех остальных ипостасях была довольно слабой. И вот создателям 3BSD пришло в голову, что нужен совершенно новый командный интерпретатор
, более удобный при работе в командной строке, с новыми возможностями программирования и с новым синтаксисом, приближенным к языку Си
, который и так знаком любому UNIX
-программисту. Получившуюся оболочку
назвали C shell
(за синтаксис
команд; имя утилиты - csh
), она была намного мощнее старой, там была работа с историей, достраивание
имен файлов, управление заданиями
; появились массивы и много чего еще. МОСКВА 2007 Лабораторный
практикум по курсу: “Операционная
система
Red
Hat
Linux
”
Лабораторная
работа №5
Программирование
в
SHELL
Цель работы
:
на основе
ранее полученных навыков работы с
командным интерпретатором BASH
овладеть начальными навыками
программирования в командном интерпретаторе
BASH
для создания файлов сценария – SHELL
скриптов. Теоретические
сведения
Выполнение
отдельных команд в командном интерпретаторе
не всегда является эффективным средством
работы с SHELL
оболочкой. Довольно часто требуется
выполнять одни и те же последовательности
действий при работе с операционной
системой Linux
каждый месяц, каждую неделю, каждый день
и иногда и несколько раз в день. Например,
предположим, вы работаете на фирме
тестером программного обеспечения
(Test
Manager).
Каждый день вам требуется в командной
оболочке Linux
выполнять один тот набор действий, а
именно: монтирование устройства CD-ROM;
копирование всей информации с него в
папку, скажем, /opt/program
на жестком диске; демонтирование CD-ROM;
чтение файла readme
из этой папки; установка программы с
жесткого диска из папки /opt/program;
создания нового файла отчета в директории
/home/user/report_program
удаление всего содержимого дистрибутива
с жесткого диска. И это притом, что
основная ваша работа заключается в
тестировании программного обеспечения
на предмет выявления недоработок (bags).
Задача на первый взгляд простая, но
выполнять подобные действия по несколько
раз в день, притом, что вы занимаетесь
и другими делами, неудобно. Или, например,
вы работаете в фирме системным
администратором и обслуживаете около
50 компьютеров. Каждый день вам требуется
раскопировать на все компьютеры один
и тот же файл с инструкциями на текущий
день директора фирмы для всех подчиненных.
Кроме того, в ваши задачи также входит
в конце рабочего дня сохранить все
данные каждого пользователя на общем
сервере фирмы с персональных компьютеров
подчиненных. Задача также на первый
взгляд простая, но работа по набору
команд в командном интерпретаторе для
50 компьютеров займет много времени. А
если к тому же вы при наборе будите
ошибаться, например, от усталости? Данные
для директора и их владельца очень
важны, и потерять их Вам никак нельзя.
Но это еще простые действия. А представьте,
что названия файлов отчетов, название
папок с данными, имена компьютеров
каждый раз будут меняться? Что тогда
делать? Выход один – написать файл-сценария
,
т.е. создать текстовый файл, в котором
требуется описать всю последовательность
команд с путями, опциями, аргументами,
выражениями, действиями и так далее для
выполнения определенного сценария.
Например, резервирования данных. После
ввода команд в текстовый файл-сценария,
данный файл делают исполняемым или
выполняют его специальных операторов
выполнения командного интерпретатора.
Использование файлов сценария является
особенно эффективным, если вам очень
часто требуется выполнять последовательность
из большого числа команд. Также является
эффективным средством, если в зависимости
от результатов выполнения предыдущих
команд зависит выполнение следующих.
С помощью файлов-сценариев можно также
использовать арифметические и логические
выражения, создавать циклы, обеспечивающие
многократное выполнение группы команд
Linux. Создание
файлов-сценария.
Создания сценариев представляет собой
последовательный набор команд, операторов
командного интерпретатора и некоторых
других символов в текстовом файле.
Файлы-сценария также называют скриптами,
а командные интерпретаторы латинским
названием SHELL.
В связи с тем, что на сегодняшний день
существуют разные командные интерпретаторы,
написание файла-сценария с использованием
дополнительных символов, например,
метасимволов, совместно с командами не
должно противоречить правилам синтаксиса
выбранного командного интерпретатора,
в котором предполагается выполнять
данный скрипт. Процесс написания таких
файлов называют SHELL
программированием. Рассмотрим процесс
программирования на примере интерпретатора
BASH.
Таким образом, скрипты и правила написания
скриптов в данной лабораторной работе
могут быть не переносимы на другие
интерпретаторы, например, такие как С
Shell
или TC
Shell. Последовательность
#!.
Написание
любого скрипта начинается с принадлежности
его к одному из командных интерпретаторов.
В первой строке скрипта обычно пишут
последовательность #! , которая указывает
системе, какой интерпретатор должен
выполнить команды из данного сценария.
Если первый символ пробел, считается,
что сценарий написан для BASH
или PDKSH.
Если сценарий начинается только с
символа # , то для его выполнения необходим
TC
Shell.
Если же за символом # следует символ!,
ядро запустит интерпретатор, путь
которого указан далее в этой строке.
Например, для BASH
будет следующая запись: #!/bin/sh
. Пробела или одиночного символа # в
начале сценария достаточно для
интерпретаторов BASH
Shell
и TC
Shell
только при условии, что они будут
считывать свой сценарий. Чтобы один
интерпретатор распознал сценарии
другого, необходимо включать в сценарий
символы #! , после чего указывается путь
интерпретирующей программы. Тогда при
вызове сценария будет прекращена работа
текущего интерпретатора, вместо него
будет загружен сценарий другого типа,
а затем выполнен сценарий. Рекомендуется
всегда начинать все сценарии с
последовательности #! . Также строки,
начинающиеся с символа # можно использовать
для комментариев действий пользователя
в скрипте. Встретив символ #, интерпретатор
shell игнорирует эту строку. Каждый
комментарий должен завершаться символом
окончания строки. Использование
комментариев является признаком хорошего
тона. Расширение
и запуск скриптов.
Обычно файлы-сценариев имеют не только
имена, но также и расширения. Чаще всего
в качестве расширений используют
комбинацию букв sh
от латинского слова shell.
По такому расширению, не открывая файл,
сразу понятно, что это shell
скрипт, так как нам опять же понятно,
что файл с расширением .
c
скорее всего является входным файлом
языков высокого уровня С и С++. После
набора содержимого файла, файл сохраняется.
Запустить файл можно двумя способами
либо сделать его исполняемым с помощью
команды chmod,
либо запускать его с помощью специальных
операторов командного интерпретатора:
sh
и. Обычно пользователи задают для
файл-сценария восьмеричные значения
750 или 550. В следующем примере сделаем
скрипт script.sh
выполняемым с помощью команды chmod
и запустим его на выполнение из текущей
директории в фоновом режиме. chmod u+x script.sh
./
script.sh
&
Теперь вернем
файлу предыдущие атрибуты и запустим
его на выполнение с помощью оператора
BASH. chmod u-x script.sh
sh script.sh&
Команда
echo
.
Помимо перечня стандартных команд
Linux,
самое простое, что можно использовать
в скрипте – это вывод текстовых
комментариев пользователю с помощью
команда echo.
Например, данную команду можно
использоваться для приглашения
пользователя выполнить какое-нибудь
действие или использовать для приветствия
пользователя. В следующем примере с
помощью echo
отображается приветствие. echo
“Добрый день!”
Команда
read
.
При создании скриптов вы можете также
применять переменные и сценарии,
написанные для других интерпретаторов
и команд. Команда read
служит командой запроса пользователя
на ввод информации. Она сочетается с
подсказкой пользователю, которая
приглашает ввести нужную информацию.
Приведем пример использования read. echo
“Введите ваше имя: ”
read
your
_
name
echo
“
Добрый
день
,”
your_name “!”
Данный скрипт
усложнен по отношению к предыдущему.
Здесь используется переменная your_name
, значение которой потом применяется
совместно с текстом. Использование
переменных.
Как
и языках программирования, в shell
Вы также можете использовать переменные,
присваивать значения переменным можно
через оператор присваивания равно «=».
Сначала вводится имя переменной, потом
без пробела знак «=», затем без пробела
значение переменной. Имя переменной
может состоять из любого количества
буквенных символов, включая символ
подчеркивания. Имя может содержать и
цифры, однако не должно начинаться с
цифры. Все остальные символы (в частности,
восклицательный знак, амперсанд и
пробел) в имя входить не должны. Такие
символы зарезервированы интерпретатором
для специальных целей. Как следствие,
имя может состоять только из одного
слова, поскольку при синтаксическом
анализе команд интерпретатор рассматривает
пробел как разделитель имен команд и
аргументов. Значение переменной может
состоять из любой последовательности
символов. В следующем примере присвоим
переменной «ppp» значение «www123yyy». ppp
=”
www
123
yyy
”
Если вы используете
в качестве значения переменной строковое
значение, используйте двойные кавычки.
После присвоения значения вы можете
пользоваться именем переменной для
ссылки на это значение, например
использовать его в качестве аргумента
команд сценария. На значение переменной
можно ссылаться посредством ее имени,
которое предваряется оператором $. Знак
доллара - это специальный оператор,
который использует имя переменной для
ссылки на ее значение, то есть фактически
для ее вычисления. Теперь с помощью уже
знакомой команды echo
и переменной «ppp»
можно отображать значение этой переменной. echo $ppp
www123yyy
Аргументы
командной строки.
В
сценарии, как и в командах Linux,
можно использовать аргументы. Аргумент
в сценарии обозначается оператором $ с
указанием номера позиции в командной
строке. Нумерация параметров начинается
с единицы, а заканчивается девятью.
Первый
параметр задается переменной $1, второй
- $2 и т. д. Аргумент $0 резервируется
для имени shell-сценария,
в качестве которого выступает первое
слово, находящееся
в командной строке. По умолчанию имеется
возможность устанавливать 9 переменных
с $1 до $9 . Если
вводится
несколько аргументов, можно отдельно
обращаться к каждому из них по его
номеру. В следующем примере в командной
строке вводятся три аргумента.
Предварительно создадим скрипт arguments
с аргументами, а потом его выполним. Обращаем ваше
внимание, если вам требуется использовать
аргумент(ы) из нескольких слов, вы должны
в командной строке взять его (их) в
двойные кавычки. Иногда требуется задать
в сценарии точное количество аргументов,
это можно выполнить с помощью аргумента
$# . Параметр
$* позволяет указать все аргументы в
командной строке. Переменная
export.
Иногда для разных файлов-сценария
требуется воспользоваться определенной
переменной, которая уже была определена.
Переменные, которые вы определяете в
интерпретаторе shell, являются локальными
для него. В некотором смысле такая
переменная принадлежит своему
интерпретатору. Непосредственно
определить переменную для другого
интерпретатора нельзя, однако можно
экспортировать определение переменной
из одного интерпретатора в другой с
помощью команды export. Команда export содержит
инструкцию для системы, в соответствии
с которой для каждого вновь образованного
shell будет определяться копия этой
переменной. Каждый новый интерпретатор
shell будет иметь собственную копию
экспортированной переменной. В следующем
примере определим переменную «rrr» и
экспортируем ее для других интерпретаторов
с помощью команды export. Арифметические
операции – команда
let
.
Команда
let
- это команда интерпретатора BASH
shell,
обеспечивающая выполнение
операций над арифметическими величинами.
С помощью этой команды можно сравнивать
числовые значения или выполнять над
ними арифметические операции, такие
как сложение или умножение. Формат
команды:
let значение1
оператор значение2. Приведем пример. $ let 2*5
10
В
арифметические выражения, использующие
оператор let,
можно включать и операторы
присваивания. В следующем примере
результат умножения двух чисел
присваивается
переменной total. $ let “total=2*5”
$ echo $total
10
$
Операторы сравнения
часто используются для сравнения
числовых значений в управляющих
конструкциях, таких как циклы и условные
переходы. В следующем примере команды
сценария file1 четырежды выводят на экран
слово "Привет!". В данном случае
для управления выходом из цикла
используется оператор let "ttt <= 4",
а для увеличения переменной цикла again
на единицу - оператор let "ttt = ttt + 1".
Обратите внимание на то, что при изменении
переменной again ее вычислять не требуется. File1
ttt=l
while let "ttt<= 4"
do
echo $ttt Привет!
let "ttt = ttt + 1"
done
Выполнение скрипта:
$ file1
Привет!
Привет!
Привет!
Кроме того, вы
также можете использовать и другие
арифметические операторы. В таблице 1
приведены арифметические операторы и
операторы сравнения Bash
Shell. Таблица 1 -
Операторы BASH shell
Арифметические
операторы
Функции
Умножение Сложение Вычитание Деление
с остатком Операторы
сравнения
Функции
Больше
чем Меньше
чем Больше
либо равно Меньше
либо равно Равенство
в выражениях Равенство
в команде let Не
равно Логическое
И Логическое
ИЛИ Логическое
НЕ Управляющие
конструкции.
Управляющие
конструкции предназначены для управления
ходом выполнения команд
shell-сценария.
Эти конструкции позволяют организовать
повторное выполнение определенной
последовательности команд или выбирать
для выполнения команды, необходимые
в конкретной ситуации. Управляющая
конструкция состоит из двух основных
компонентов: операции проверки и команд.
В результате выполнения сравнения
(проверки
условия) возвращается значение «истина»
или «ложь», а затем на основании
полученного
результата выполняются определенные
команды. Существует
два вида управляющих конструкций:
циклические
(циклы)
и
условные
(ус
ловия).
Циклическая
конструкция используется для повторного
выполнения команд, тогда
как условная - для выполнения
последовательности команд.,
которая
удовлетворяет
определенным условиям. В интерпретаторе
BASH
shell
можно использовать три циклические
конструкции, while,
for
и for-in,
и две условные - if
и case. Управляющие
конструкции while
и if
- это конструкции общего назначения,
которые
обычно используются при решении таких
задач, как итерационные вычисления и
проверка различных условий. Управляющие
конструкции case
и for
ориентированы на
более узкий круг задач. Конструкция
case
является многовариантным оператором
и
представляет собой частный случай
условного оператора if.
Эта конструкция часто используется
при создании меню. Конструкция for
представляет собой цикл, однократно
обрабатывающий всю информацию для
каждого значения, включенного в список,
до тех пор, пока не встретится окончание
списка. Кроме
сравнения значений или переменных,
управляющие конструкции if
и while
можно
применять для проверки того, успешно
или неудачно была выполнена системная
команда Linux.
Напомним, что в Linux
каждая выполняемая команда возвращает
код завершения.
Если выполнение команды было успешным,
ее код завершения равен 0. Если
по какой-либо причине команда не была
выполнена успешно, кодом завершения
будет
некоторое положительное значение,
указывающее тип ошибки. Управляющие
конструкции
if
и while
позволяют проверить, чему был равен код
завершения: 0 или некоторому
другому значению. Если код завершения
равен нулю, значит, выполнение команды
было успешным и управляющая конструкция
if
или while
будет завершена. Команда
test
.
Сравнивать значения можно не только с
помощью условных управляющих конструкций,
но также с помощью команды test. При
сравнении двух значений test возвращает
0 в том случае, если сравнение будет
успешным. Команда test позволяет сравнивать
целые числа, строки и даже выполнять
логические операции. Совместно с
командой test применяют опции, которые
задают тип сравнения. Полный перечень
опций приведен в таблице 2. Таблица 2. Операции, выполняемые
командой test интерпретатора BASH shell
Сравнение целых
чисел
Функция
Больше
чем Меньше
чем Больше
чем либо равно Меньше
чем либо равно Не
равно Сравнение строк
Функция
Проверка
на наличие пустой строки Проверка
на наличие строкового значения Проверка
строк на равенство Прооверка
строк на неравенство Проверка
на наличие строки, состоящей из нулей Логические
операции
Функция
Логическое
И Логическое
ИЛИ Логическое
НЕ Проверка файлов
Функция
Установка
факта существования файла и его
регулярности Проверяется,
не является ли файл пустым Проверка
возможности считывания из файла Проверка
возможности записи в файл, а также его
изменения Проверяется,
является ли файл исполнимым Проверяется,
является ли имя файла именем каталога Проверяется,
является ли имя файла символической
ссылкой Проверяется,
обозначает ли имя файла байт-ориентированное
устройство Проверяется,
обозначает ли имя блок-ориентированное
устройство Команда
test
имеет следующий синтаксис: test значение -опция значение
test строка = строка
В
следующем примере покажем пример
использования команды test.
Сравним целочисленных значения, для
этого используем опцию равенства –eq.
Для проверки результата выполнения
операции сравнения используем код
завершения последней выполненной
командыtest, который
храниться в переменной $? интерпретатораshell. $
tot
=
4
$
test $
tot
-eq
7
$ echo $?
1
Также
команда test
$tot
–eq
7 может быть записана и в другом виде: $ [ $tot –eq 7 ]
Условные
конструкции:
if,
if-else, elif, case
.
Интерпретатор
BASH
shell
включает несколько условных управляющих
конструкций (табл. 3), которые позволяют
выбирать для выполнения определенные
команды Linux.
Многие из этих конструкций напоминают
условные управляющие конструкции в
языках программирования,
но имеются и некоторые отличия. Таблица
3 – Управляющие конструкции интерпретаторов
bash
Shell
Условные управляющие конструкции
Функция
if команда then команда fi Конструкция if вызывает выполнение
действия в случае, если результат
проверки истинен if команда then команда else команда fi Конструкция if-else вызывает выполнение
действия в случае, если код завершения
проверяемой команды paвен значению
«истина», в противном случае выполняется
действие else if команда then команда elif команда then
команда else команда fi Конструкция elif дает возможность
вкладывать конструкции if, что позволяет
выбрать один из многих вариантов; если
истинно условие, проверяемое первой
конструкцией if, выполняются
предусмотренные в ней команды и
следующей конструкции elif управление
не передается case строка in шаблон) команда;; еsас Конструкция case сравнивает строковое
значение с одним из нескольких шаблонов
(образцов). При обнаружении совпадения
выполняются команды, соответствующие
этому шаблону команда && команда Логическая операция И возвращает
значение 0 («истина»), если обе команды
возвращают значение 0; если же одна из
команд возвращает ненулевое значение,
результат операции И равен «ложь»
и данная операция возвращает
ненулевое значение команда | | команда Логическая операция ИЛИ, возвращающая
значение 0 («истина») в случае, если
одна или обе команды возвращают
значение 0 («истина»); если обе команды
возвращают ненулевое значение, то
результат операции ИЛИ - «ложь» и
операция возвращает ненулевое значение Команда Логическая операция НЕ, инвертирует
код завершения команды while команда do команды done Конструкция while выполняет действие
до тех пор, пока команда проверки
возвращает значение «истина» until команда do команды done Конструкция
until
выполняет действие до тех пор, пока
команда
проверки возвращает значение «ложь» Циклические управляющие конструкции
Функция while, until, for, for-in, select
for переменная in список-значений do
команды done Конструкция for-in предназначена для
обработки списка значений. Переменной
последовательно присваиваются значения
из списка for переменная do команды done Конструкция for предназначена для
последовательной обработки аргументов
сценария. Переменной последовательно
присваивается значение каждого
аргумента select строка in перечень-элементов do
команды done Конструкция select создает меню на основе
элементов заданного списка, а затем
выполняется указанная команда (обычно
это команда case) Условная
конструкция
if
-
then
.
Условная конструкция
if
ставит условие на выполнение команды.
Этим условием является код
завершения какой-то конкретной команды
Linux.
Если команда выполнена успешно (то
есть код завершения равен 0), то команды
внутри конструкции if
выполняются. Если
код завершения отличен от 0, то команды
внутри конструкции if
выполняться не
будут. Иногда требуется выбрать один
из двух вариантов, в зависимости от того
как была выполнены команда Linux.
Ключевое слово else
конструкции if
позволяет выбрать один из двух вариантов.
Приведем синтаксис команды if-then-else. Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно. Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ. В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды. Типичный вид шелла: Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами. Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно. На MacOS - тоже запустить Terminal. Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows). Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз. Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда. Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте. Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки. Попробуйте выполнить команду date +"%y-%m-%d, %A" После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу). Как именно копировать текст из терминала и вставлять его в терминал - зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование - просто выделение мышью, вставка - средняя кнопка мыши. Если не работает, или если у вас другая система - поищите в Интернете или спросите более опытных знакомых. Akira@latitude-e7240:
~/shell-survival-quide> ls
Makefile shell-first-steps.md shell-first-steps.pdf
shell-survival-quide.md shell-survival-quide.pdf
Akira@latitude-e7240:
~/shell-survival-quide> ls -l
total 332
-rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile
-rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md
-rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf
-rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md
-rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте: Ls -ld /home
ls -l /home
grep root /etc/passwd
Попробуйте: man grep , man atoi , man chdir , man man . Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . Все справочные статьи делятся на категории. Самые важные: Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады). Попробуйте и сравните поведение: Cat /etc/bash.bashrc
cat /etc/bash.bashrc |less
Можно передать файл в пролистыватель сразу в параметрах: Less /etc/bash.bashrc
Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .) Посмотреть права на файл можно с помощью ls -l . Например: > ls -l Makefile
-rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать. Подробнее читайте в man chmod . Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится: > wc
good day today
good day
2 5 24
Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так: > head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT . Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе. Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп. Объединение программ в конвейер делается символом | (вертикальная черта) Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее: > head -n3 /etc/passwd |wc
3 3 117
В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc: > head -n3 /etc/passwd |wc |wc
1 3 24
Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника». Date > /tmp/today.txt
Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды. Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> : Date >> /tmp/today.txt
Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте: Wc Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) -- запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях. Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить
.См. также раздел «Составление конвейера-однострочника». Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у). Шаг 1.
Шаг 2.
Ps axuww |grep `whoami`
Шаг 3.
Ps axuww |grep `whoami` | grep "\ Ps axuww |grep `whoami` | grep "\ Pid-ы нужных процессов, п. 3 выполнен Шаг 4.
Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке: Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно. Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ. В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды. Типичный вид шелла: Шелл - это основной способ для взаимодействия со всеми Unix-подобными серверными системами. Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно. На MacOS - тоже запустить Terminal. Для доступа к удаленному серверу - воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows). Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter - команда выполнится еще раз. Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после - нет). Нажмите Enter - выполнится модифицированная команда. Пролистывание истории, редактирование и повторное выполнение команд - самые типичные действия при работе в командной строке, привыкайте. Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки. Попробуйте выполнить команду date +"%y-%m-%d, %A" После того, как научитесь пользоваться man "ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу). Как именно копировать текст из терминала и вставлять его в терминал - зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование - просто выделение мышью, вставка - средняя кнопка мыши. Если не работает, или если у вас другая система - поищите в Интернете или спросите более опытных знакомых. Akira@latitude-e7240:
~/shell-survival-quide> ls
Makefile shell-first-steps.md shell-first-steps.pdf
shell-survival-quide.md shell-survival-quide.pdf
Akira@latitude-e7240:
~/shell-survival-quide> ls -l
total 332
-rw-rw-r-- 1 akira akira 198 Feb 13 11:48 Makefile
-rw-rw-r-- 1 akira akira 15107 Feb 14 22:26 shell-first-steps.md
-rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf
-rw-rw-r-- 1 akira akira 16626 Feb 13 11:45 shell-survival-quide.md
-rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте: Ls -ld /home
ls -l /home
grep root /etc/passwd
Попробуйте: man grep , man atoi , man chdir , man man . Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки - кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . Все справочные статьи делятся на категории. Самые важные: Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка - тоже часть комады). Попробуйте и сравните поведение: Cat /etc/bash.bashrc
cat /etc/bash.bashrc |less
Можно передать файл в пролистыватель сразу в параметрах: Less /etc/bash.bashrc
Пролистывание вверхи и вниз - кнопки «вверх», «вниз», «PageUp», «PageDown», выход - кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям - клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .) Посмотреть права на файл можно с помощью ls -l . Например: > ls -l Makefile
-rw-r--r-- 1 akira students 198 Feb 13 11:48 Makefile
Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать. Подробнее читайте в man chmod . Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится: > wc
good day today
good day
2 5 24
Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так: > head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
Можно представить себе так: программа - это труба, в которую втекает STDIN , а вытекает STDOUT . Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход (STDOUT) одной программы передавать в качестве входных данных (STDIN) другой программе. Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски - конвейер или пайп. Объединение программ в конвейер делается символом | (вертикальная черта) Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее: > head -n3 /etc/passwd |wc
3 3 117
В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc: > head -n3 /etc/passwd |wc |wc
1 3 24
Составление конвейеров (пайпов) - очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника». Date > /tmp/today.txt
Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды. Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> : Date >> /tmp/today.txt
Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте: Wc Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) -- запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях. Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить
.См. также раздел «Составление конвейера-однострочника». Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям (root "у). Шаг 1.
Шаг 2.
Ps axuww |grep `whoami`
Шаг 3.
Ps axuww |grep `whoami` | grep "\ Ps axuww |grep `whoami` | grep "\ Pid-ы нужных процессов, п. 3 выполнен Шаг 4.
Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:
file - имя файла, который будет
редактироваться;
old_text - текст, который будет изменен;
new_text - новый текст.9.3.4. Коды завершения
9.3.4.1. Проверка кодов завершения
9.3.5. Циклы
9.3.5.1. Оператор for
9.3.5.2. Оператор while
9.3.6. Использование /dev/null
9.3.7. Условные операторы
9.3.8. Безусловная передача
управления
Сценарий
Гнезда shell`ов
Зачем и для кого статья?
Изначально это была памятка для студентов, которые начинают работать с unix-подобными системами. Иными словами, статья рассчитана на тех, кто не имеет предыдущего опыта работы в unix-овой командной строке, но по тем или иным причинам хочет или должен научиться эффективно с нею взаимодействовать.Что такое шелл
Shell (шелл, он же «командная строка», он же CLI, он же «консоль», он же «терминал», он же «черное окошко с белыми буковками») -- это текстовый интерфейс общения с операционной системой (ну, строго говря, это программа
, которая таковой интерфейс обеспечивает, но сейчас это различие несущественно). Где встречаются системы с командной строкой?
Где вас может поджидать unix-овый шелл, популярные варианты:Какие задачи разумно решать шеллом?
Естественные задачи, для которых шелл пригоден, полезен и незаменим:Абсолютно первые шаги
Начинаем работу: войти и выйти
Убедитесь, что точно знаете, как запустить шелл и как из него выйти.Кто я, где я?
Выполните следующие команды:История команд (history)
Важное свойство полноценной командной строки - история команд.Copy-paste
Командная строка очень текстоцентрична: команды - это текст, входные данные для большинства стандартных программ - текст, результат работы - чаще всего тоже текст.
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.Ключи и опции
При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:
Если же добавить ключ -l , к каждому файлу выводится подробная информация:
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f . man
man - справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.
Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf - консольную программу с таким же именем.less
Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель - less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы. Права
С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.STDIN, STDOUT, конвейеры (пайпы)
С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.Перенаправление ввода-вывода
Вывод (STDOUT) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt
Проверьте, что теперь записано в файле.Что делать, когда что-то непонятно
Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):
Если ничего из перечисленного не помогло - обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы - не стыдно не знать, стыдно не спрашивать.Методы работы
Скопировать-и-вставить
- из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.Базовые команды
Аналитика
Диагностика системы
Массовое и полуавтоматическое выполнение
На первых порах пропускайте этот раздел, эти команды и конструкции понадобятся вам тогда, когда доберетесь до несложного шелльного скриптинга. Разное
Составление конвейера-однострочника
Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе:
ps axuww . Запустить.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.
- только процессы текущего пользователя.
Повторять пункт 2, пока не получатся чистые нужные данные.
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),
- только процессы с нужным именем
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:Задания для тренировки
Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:
Подсказка: вам понадобится find , grep -o , awk "{print $1}" , регулярные выражения в grep , curl -s .Что изучать дальше?
Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.
Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python , или даже их оба.Кому это надо?
А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.
Зачем и для кого статья?
Изначально это была памятка для студентов, которые начинают работать с unix-подобными системами. Иными словами, статья рассчитана на тех, кто не имеет предыдущего опыта работы в unix-овой командной строке, но по тем или иным причинам хочет или должен научиться эффективно с нею взаимодействовать.Что такое шелл
Shell (шелл, он же «командная строка», он же CLI, он же «консоль», он же «терминал», он же «черное окошко с белыми буковками») -- это текстовый интерфейс общения с операционной системой (ну, строго говря, это программа
, которая таковой интерфейс обеспечивает, но сейчас это различие несущественно). Где встречаются системы с командной строкой?
Где вас может поджидать unix-овый шелл, популярные варианты:Какие задачи разумно решать шеллом?
Естественные задачи, для которых шелл пригоден, полезен и незаменим:Абсолютно первые шаги
Начинаем работу: войти и выйти
Убедитесь, что точно знаете, как запустить шелл и как из него выйти.Кто я, где я?
Выполните следующие команды:История команд (history)
Важное свойство полноценной командной строки - история команд.Copy-paste
Командная строка очень текстоцентрична: команды - это текст, входные данные для большинства стандартных программ - текст, результат работы - чаще всего тоже текст.
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.Ключи и опции
При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:
Если же добавить ключ -l , к каждому файлу выводится подробная информация:
Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f . man
man - справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.
Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf - консольную программу с таким же именем.less
Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель - less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы. Права
С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.
Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) - только читать, всем прочим пользователя - тоже только читать.STDIN, STDOUT, конвейеры (пайпы)
С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .
В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.
В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.
Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.Перенаправление ввода-вывода
Вывод (STDOUT) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):
В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt
Проверьте, что теперь записано в файле.Что делать, когда что-то непонятно
Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):
Если ничего из перечисленного не помогло - обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы - не стыдно не знать, стыдно не спрашивать.Методы работы
Скопировать-и-вставить
- из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.Базовые команды
Аналитика
Диагностика системы
Массовое и полуавтоматическое выполнение
На первых порах пропускайте этот раздел, эти команды и конструкции понадобятся вам тогда, когда доберетесь до несложного шелльного скриптинга. Разное
Составление конвейера-однострочника
Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе:
ps axuww . Запустить.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.
- только процессы текущего пользователя.
Повторять пункт 2, пока не получатся чистые нужные данные.
- все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),
- только процессы с нужным именем
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:Задания для тренировки
Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:
Подсказка: вам понадобится find , grep -o , awk "{print $1}" , регулярные выражения в grep , curl -s .Что изучать дальше?
Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.
Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python , или даже их оба.Кому это надо?
А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.