Bash-скрипты, часть 3: параметры и ключи командной строки
Освоив предыдущие части этой серии материалов, вы узнали о том, что такое bash-скрипты, как их писать, как управлять потоком выполнения программы, как работать с файлами. Сегодня мы поговорим о том, как добавить скриптам интерактивности, оснастив их возможностями по получению данных от пользователя и по обработке этих данных.
Наиболее распространённый способ передачи данных сценариям заключается в использовании параметров командной строки. Вызвав сценарий с параметрами, мы передаём ему некую информацию, с которой он может работать. Выглядит это так:
В данном примере сценарию передано два параметра — «10» и «20». Всё это хорошо, но как прочесть данные в скрипте?
Чтение параметров командной строки
Оболочка bash назначает специальным переменным, называемым позиционными параметрами, введённые при вызове скрипта параметры командной строки:
Запустим сценарий с параметрами:
Вот что он выведет в консоль.
Вывод параметров, с которыми запущен скрипт
Обратите внимание на то, что параметры командной строки разделяются пробелами.
Взглянем на ещё один пример использования параметров. Тут мы найдём сумму чисел, переданных сценарию:
Запустим скрипт и проверим результат вычислений.
Сценарий, который находит сумму переданных ему чисел
Параметры командной строки не обязательно должны быть числами. Сценариям можно передавать и строки. Например, вот скрипт, работающий со строкой:
Он выведет то, что мы от него ожидаем.
Сценарий, работающий со строковым параметром
Что если параметр содержит пробелы, а нам надо обрабатывать его как самостоятельный фрагмент данных? Полагаем, если вы освоили предыдущие части этого руководства, ответ вы уже знаете. Заключается он в использовании кавычек.
Если скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например так:
Проверка параметров
Если скрипт вызван без параметров, но для нормальной работы кода предполагается их наличие, возникнет ошибка. Поэтому рекомендуется всегда проверять наличие параметров, переданных сценарию при вызове. Например, это можно организовать так:
Вызовем скрипт сначала с параметром, а потом без параметров.
Вызов скрипта, проверяющего наличие параметров командной строки
Подсчёт параметров
В результате скрипт сообщит о том, что ему передано 5 параметров.
Подсчёт количества параметров в скрипте
Эта переменная даёт необычный способ получения последнего из переданных скрипту параметров, не требующий знания их количества. Вот как это выглядит:
Вызовем скрипт и посмотрим, что он выведет.
Обращение к последнему параметру
Захват всех параметров командной строки
Рассмотрим разницу между этими переменными на примерах. Сначала взглянем на их содержимое:
Как видно, при выводе обеих переменных получается одно и то же. Теперь попробуем пройтись по содержимому этих переменных в циклах для того, чтобы увидеть разницу между ними:
Взгляните на то, что скрипт вывел в консоль. Разница между переменными вполне очевидна.
Команда shift
Использовать команду shift в bash-скриптах следует с осторожностью, так как она, в прямом смысле слова, сдвигает значения позиционных параметров.
Использование команды shift для перебора параметров
Ключи командной строки
Ключи командной строки обычно выглядят как буквы, перед которыми ставится тире. Они служат для управления сценариями. Рассмотрим такой пример:
И проанализируем то, что он выведет в терминал.
Обработка ключей в скрипте
Как различать ключи и параметры
Часто при написании bash-скриптов возникает ситуация, когда надо использовать и параметры командной строки, и ключи. Стандартный способ это сделать заключается в применении специальной последовательности символов, которая сообщает скрипту о том, когда заканчиваются ключи и начинаются обычные параметры.
Эта последовательность — двойное тире (—). Оболочка использует её для указания позиции, на которой заканчивается список ключей. После того, как скрипт обнаружит признак окончания ключей, то, что осталось, можно, не опасаясь ошибок, обрабатывать как параметры, а не как ключи. Рассмотрим пример:
Этот сценарий использует команду break для прерывания цикла while при обнаружении в строке двойного тире.
Вот что получится после его вызова.
Обработка ключей и параметров командной строки
Как видно, когда скрипт, разбирая переданные ему данные, находит двойное тире, он завершает обработку ключей и считает всё, что ещё не обработано, параметрами.
Обработка ключей со значениями
По мере усложнения ваших скриптов, вы столкнётесь с ситуациями, когда обычных ключей уже недостаточно, а значит, нужно будет использовать ключи с некими значениями. Например, вызов сценария в котором используется подобная возможность, выглядит так:
Скрипт должен уметь определять, когда вместе с ключами командной строки используются дополнительные параметры:
Вызовем этот скрипт в таком виде:
Посмотрим на результаты его работы.
Обработка параметров ключей
Использование стандартных ключей
При написании bash-скриптов вы можете выбирать любые буквы для ключей командной строки и произвольно задавать реакцию скрипта на эти ключи. Однако, в мире Linux значения некоторых ключей стали чем-то вроде стандарта, которого полезно придерживаться. Вот список этих ключей:
-a Вывести все объекты.
-c Произвести подсчёт.
-d Указать директорию.
-e Развернуть объект.
-f Указать файл, из которого нужно прочитать данные.
-h Вывести справку по команде.
-i Игнорировать регистр символов.
-l Выполнить полноформатный вывод данных.
-n Использовать неинтерактивный (пакетный) режим.
-o Позволяет указать файл, в который нужно перенаправить вывод.
-q Выполнить скрипт в quiet-режиме.
-r Обрабатывать папки и файлы рекурсивно.
-s Выполнить скрипт в silent-режиме.
-v Выполнить многословный вывод.
-x Исключить объект.
-y Ответить «yes» на все вопросы.
Если вы работаете в Linux, вам, скорее всего, знакомы многие из этих ключей. Использовав их в общепринятом значении в своих скриптах, вы поможете пользователям взаимодействовать с ними, не беспокоясь о чтении документации.
Получение данных от пользователя
Ключи и параметры командной строки — это отличный способ получить данные от того, кто пользуется скриптом, однако в некоторых случаях нужно больше интерактивности.
Эта команда позволяет принимать введённые данные либо со стандартного ввода (с клавиатуры), либо используя другие дескрипторы файлов. После получения данных, эта команда помещает их в переменную:
Обработка пользовательского ввода
При вызове read можно указывать и несколько переменных:
Вот что выведет скрипт после запуска.
Несколько переменных в команде read
Использование переменной среды REPLY
Ограничение времени на ввод данных
Ввод паролей
Вот как отработает этот скрипт.
Ввод конфиденциальных данных
Чтение данных из файла
Напишем скрипт, в котором используется только что описанный подход к чтению файлов.
Посмотрим на него в деле.
Чтение данных из файла
Тут мы передали в цикл while содержимое файла и перебрали все строки этого файла, выводя номер и содержимое каждой из них.
Итоги
Сегодня мы разобрали работу с ключами и параметрами командной строки. Без этих средств диапазон использования скриптов оказывается чрезвычайно узким. Даже если скрипт написан, что называется, «для себя». Тут же мы рассмотрели подходы к получению данных от пользователя во время выполнения программы — это делает сценарии интерактивными.
В следующий раз поговорим об операциях ввода и вывода.
Уважаемые читатели! Спасибо вам за то, что делитесь опытом в комментариях к предыдущим частям этого цикла материалов. Если вам есть что сказать об обработке всего того, что можно передать в скрипт при запуске или во время его работы, уверены, многим будет интересно об этом почитать.
Выбор редакции
Топ-60 лучших фильмов Амазон.
Топ-10 лучших фильмов декабря.
Топ-1000 лучших зарубежных.
Команды Linux
Обзор популярных команд Linux, описание работы с консолью и терминалом.
Современные пользователи персональных компьютеров привыкли к графическому интерфейсу. Однако иногда приходится использовать интерфейс командной строки, то есть вводить определенные команды вручную. Например, в случае отсутствия графической оболочки, при восстановлении и настройке системы и т. д. Более того, с помощью командной строки некоторые действия выполнять быстрее и удобнее, чем с помощью привычного графического интерфейса.
Командная строка — это очень мощное средство управления системой. Некоторые начинающие пользователи боятся работать в консоли, считая, что это слишком сложно и непонятно. На самом деле это не так, достаточно освоить некоторые приемы работы и несколько простых команд и с остальными командами разобраться будет значительно проще. Графический интерфейс получил широкое распространение не так уж и давно — в конце прошлого века. А до этого все пользователи компьютеров работали с командной строкой.
В любом случае, пользователям Linux стоит освоить работу в консоли, эти навыки им обязательно пригодятся в дальнейшем. В этой статье мы рассмотрим работу с консолью и терминалом, а также основные часто применяемые команды Linux, не претендуя на полноту, поскольку полное их описание с примерами может занять не один том.
Чтобы получить доступ к консоли, находясь в графическом режиме, нужно нажать комбинацию клавиш Ctrl+Alt+F1. Далее нужно будет ввести логин и пароль, как при загрузке системы. Можно открыть несколько консолей, с помощью комбинаций клавиш Ctrl+Alt+F2, Ctrl+Alt+F3 и т.д. (до F6) и запускать в них различные программы одновременно. Для возврата в графическое окружение нужно нажать Alt+F7, при этом консоли остаются открытыми и программы, запущенные в них, будут продолжают работать.
Для работы с командной строкой непосредственно в графическом режиме существуют специальные программы — эмуляторы терминалов. Есть множество подобных программ: gnome-terminal — стандартный терминал в GNOME, konsole — стандартный терминал в KDE, xterm, tilda и т. д. Для открытия стандартного терминала в Ubuntu Linux нужно нажать комбинацию клавиш Ctrl+Alt+T, либо кликнуть на иконку терминала на панели. В других системах возможно придется запускать программу терминала через меню, для удобства можно установить иконку запуска терминала на панель или рабочий стол. Чтобы получить удаленный доступ к компьютеру через терминал, можно воспользоваться программами telnet или ssh, которые будут рассмотрены ниже. А в Windows программой PuTTY, которую можно скачать здесь: http://www.chiark.greenend.org.uk/
Рис. 1. Эмулятор терминала Konsole
Обратите внимание, что команды, ключи, имена файлов в Linux зависят от регистра. То есть, LS и ls — это разные команды, если вместо ls набрать LS, то эффект будет неожиданным. Длинные команды удобно набирать, используя клавишу «Tab», которая служит для автодополнения, достаточно набрать первые буквы из названия команды и нажать эту клавишу. Если есть несколько команд, которые начинаются с введенных символов, то они отобразятся на экране, в этом случае нужно набрать еще один или несколько символов и опять нажать «Tab». Аналогично клавиша «Tab» может быть использована для быстрого набора параметров, имен длинных файлов и т.д. C помощью курсорных клавиш можно просматривать и редактировать уже введенные команды.
Также можно использовать следующие сочетания клавиш:
Ctrl+C — прервать работу программы (обратите внимание, что в графическом окружении эта же комбинация клавиш используются для копирования).
Ctrl+Shift+C — скопировать выделенную информацию в буфер, для выделения можно использовать мышь.
Ctrl+Shift+V — вставить информацию из буфера. Для вставки текста также удобно использовать среднюю кнопку мыши (колесо прокрутки), предварительно выделив текст.
Ctrl+S — приостановить вывод на терминал.
Ctrl+Q — возобновить вывод на терминал. Хотя обычно для этого можно использовать любую клавишу. Иногда помогает если терминал «завис».
Ctrl+Z — остановить работу программы. Для продолжения нужно набрать команду fg (либо bg для продолжения работы программы в фоновом режиме).
Ctrl+D — выход из терминала, закрытие консоли, разрыв соединения с удаленным компьютером.
Теперь перейдем непосредственно к рассмотрению команд Linux.
Информационные команды
man команда — выводит подробную информацию о команде Linux, ключах и т.д. Например: man date.
К сожалению не все руководства переведены на русский, возможно потребуются начальные знания английского.
date — выводит текущую дату и время.
who — выдает список пользователей, которые сейчас находятся в системе. Не стоит пугаться, если будет найдено несколько пользователей на персональном компьютере, это вовсе не означает, что его взломали хакеры. Обратите внимание на их имена. Каждый открытый терминал, включая графический, система считает отдельным пользователем.
free — вывод информации об оперативной памяти.
top — выводит информацию о процессах, о загрузке процессора, о распределении памяти.
uptime — отображает время работы системы, количество пользователей, загрузку процессора.
pwd — показывает текущий каталог.
time — измеряет время работы программы, например time ls.
Команды для работы с файлами
ls — выводит список файлов в текущем каталоге. Чтобы отобразить список файлов в любом каталоге, нужно набрать путь к каталогу после команды, например: ls /usr/bin. Некоторые ключи команды ls:
-a — показать скрытые файлы;
-s — указать размер файлов в блоках;
-t — сортировка по времени модификации файлов, сначала новые файлы;
-X — сортировка по расширению названия файлов, файлы без расширения выводятся вначале;
-l — расширенный формат вывода: показывает атрибуты, владельцев и группу файлов, размер, дату и время их создания;
-r — изменить порядок сортировки на обратный. Например, команда
cp — копирование файлов. cp doc1 doc2 — создаст копию файла doc1 под именем doc2.
rmdir — удаление директории. rmdir alex — удалит каталог alex.
Нужно быть очень осторожным с командами rm и rmdir, особенно в режиме суперпользователя, поскольку можно удалить не только свои, но и системные файлы, что может привести к краху системы.
pwd — вывод текущей директории.
mkdir — создание новой директории. mkdir alex — создаст каталог alex.
mv — перемещение или переименование файлов. mv new old — переименует файл new в old.
cat — соединение файлов или вывод файлов на стандартное устройство вывода. cat doc — выведет файл doc.
cat /proc/cpuinfo — выдаст подробную информацию о процессоре, cat /proc/version — о версии ядра Linux.
touch — создание пустого файла.
more — вывод файлов с остановкой для просмотра, в отличие от cat, который выводит весь файл сразу. Можно прокручивать текст построчно, с помощью клавиши ввода или постранично с помощью пробела.
less — программа для просмотра файлов аналогичная more, но позволяет прокручивать текст вверх и управлять с помощью курсорных клавиш.
nano — простой полноэкранный текстовый редактор. Рекомендуется для новичков, поскольку содержит минимум функций и основные команды отображаются на экране.
vi — довольно мощный текстовый редактор, но он имеет свою нестандартную систему команд, поэтому требует время на освоение.
mc (Midnight Commander) — мощный файловый менеджер, аналог Norton Commander для DOS или FAR для Windows. Позволяет удалять, копировать, переименовывать, просматривать, редактировать файлы, менять их атрибуты и т. д. Midnight Commander обычно не входит в стандартный набор системных программ, поэтому его нужно устанавливать отдельно. Но он настоятельно рекомендуется к использованию, поскольку сильно упрощает работу с файлами.
Рис. 2. Midnight Commander в gnome-terminal
Установка и удаление программ
Для установки и удаления программ используются различные утилиты, в зависимости от версии дистрибутива Linux. В основанных на Debian дистрибутивах (Ubuntu, Linux Mint и т. д.) для этой цели используются команды apt-get или aptitude. Первый вариант упрощенный, второй имеет большую функциональность. Некоторые действия, например, установку и удаление, нужно выполнять от root, либо использовать команду sudo.
sudo apt-get update — получение нового списка пакетов.
sudo apt-get upgrade — обновить программы, перед этим нужно обновить список пакетов, выполнив предыдущую команду. Обе команды желательно выполнять периодически (часто это делается автоматически), а также перед установкой новых программ.
sudo apt-get install mc — установка программы mc.
sudo apt-get remove mc — удаление программы mc. В дистрибутивах, основанных на Red Hat, где используются RPM-пакеты, часто используют менеджер yum.
yum update — обновление системы.
yum install mc — установка программы mc.
yum remove mc — удаление программы mc. Есть и другие пакетные менеджеры и варианты установки программного обеспечения.
Сетевые команды и работа с удаленными компьютерами
ping — проверка связи с определенным адресом в сети. ping google.com — проверка доступности сайта google.com, также можно использовать IP-адрес: ping 192.168.1.5. Если ответа нет, то это не означает на 100%, что нет связи, иногда работу этой команды блокируют в сети.
traceroute — показывает маршрут прохождения трафика. Например: traceroute google.com. Позволяет определить, на каком участке сети возникают проблемы.
telnet — подключение к удаленному компьютеру. Дает возможность выполнять команды на другом компьютере. В основном используется во внутренней сети, поскольку трафик не шифруется. Пример: telnet 192.168.1.1.
ftp — подключение к удаленному компьютеру по протоколу передачи файлов. ftp site.com — подключение к серверу site.com.
sftp — команда аналогична ftp, но соединение происходит по шифрованному протоколу.
ifconfig — информация о сетевых соединениях и их настройка.
hostname — отображает или изменяет сетевое имя компьютера.
whois сайт или IP-адрес — выводит информацию о домене, владельце доменного имени или IP-адреса, например whois google.com или whois 8.8.8.8.
dig — выводит информацию о DNS, например dig google.com. Можно обратиться к любому DNS-серверу, указав его следующим образом: dig @8.8.8.8 google.com. Для получения информации с DNS-сервера можно также воспользоваться программами host и nslookup, указав после них доменное имя или IP-адрес, но эти утилиты имеют урезанную функциональность, по сравнению с dig.
lynx, links, links2 (3 отдельные команды) — текстовые браузеры, позволяют просматривать сайты прямо из консоли.
Команды администрирования
su — смена пользователя. su alex — сменит пользователя на alex. Набрав su без параметров, вы получите права суперпользователя (root), при этом символ подсказки $ сменится на #.
В этом режиме не стоит находиться постоянно, а лучше вообще его не использовать, а пользоваться командой sudo.
Для выхода из сессии и возврата к предыдущему пользователю нужно набрать exit.
sudo — позволяет выполнять другие программы с правами суперпользователя, набирается перед другой командой, например
sudo rm file — удалит файл, созданный любым пользователем.
Использовать команду sudo нужно также очень внимательно и только в случае необходимости.
passwd — смена пароля текущего пользователя. passwd alex — смена пароля пользователя alex.
adduser или useradd — добавить нового пользователя. adduser katya — добавит пользователя katya. После набора команды нужно ввести пароль. Для выполнения команды нужно быть суперпользователем.
userdel — удалить пользователя. userdel vasya — удалит пользователя vasya.
groupadd — создание новой группы. groupadd students — создаст группу students.
groupdel — удаление группы. groupdel students — удалит группу students.
chmod — изменить права доступа файла или каталога. chmod 644 file — установит права 644 на файл. chmod +x file — даст файлу права на выполнение.
chown — изменить хозяина файла. chown alex file — в результате выполнения этой команды хозяином файла станет alex.
chgrp — изменение группы файла. chgrp students laba1 — смена группы файла laba1 на students.
Команды для работы с процессами
ps — вывести список процессов. ps axu — посмотреть все процессы. ps axu | grep win — отобразить все процессы, где встречаются символы «win».
killall команда — завершает все процессы, запущенные с помощью указанной команды.
bg — продолжить работу программы в фоновом режиме, например после комбинации клавиш Ctrl+Z. После команды может быть указан PID:
bg 1234.fg — продолжить выполнение программы в обычном режиме, также может быть указан PID.
Прочие команды Linux и языки программирования
Некоторые команды из этого списка могут отсутствовать в стандартных дистрибутивах, их можно установить отдельно.
sed — мощная утилита для обработки текста.
awk — язык для обработки текста.
grep — утилита поиска текста с использованием регулярных выражений, часто используется в связке с другими командами. grep ‘^a’ ‘text.txt’ — покажет все строки в файле text.txt, которые начинаются с буквы а.
emacs — продвинутый текстовый редактор, обладающий большим количеством функций, вплоть до встроенных игр. Для опытных пользователей.
gcc — компилятор языка C, с помощью которого можно получить исполняемые файлы программ, которые распространяются в исходных кодах. Или откомпилировать свои программы.
python — вызов интерпретатора языка Python. Это современный и мощный язык, который может быть рекомендован начинающим.
exit — завершение текущей сессии, может применяться для отключения от удаленного компьютера, закрытия терминала.