- Ключи
- Однобуквенные ключи
- Полнословные ключи
- Команды Linux: расширенный справочник команд Unix / Linux / PuTTY SSH
- Bash-скрипты, часть 3: параметры и ключи командной строки
- Чтение параметров командной строки
- Проверка параметров
- Подсчёт параметров
- Захват всех параметров командной строки
- Команда shift
- Ключи командной строки
- Как различать ключи и параметры
- Обработка ключей со значениями
- Использование стандартных ключей
- Получение данных от пользователя
- Ввод паролей
- Чтение данных из файла
- Итоги
Ключи
Работая в системе и изучая руководства, Мефодий заметил, что параметры команд можно отнести к двум различным категориям. Некоторые параметры имеют собственный смысл: это имена файлов, названия разделов и объектов в man и info , числа и т. п. Другие параметры собственного смысла не имеют, их значение можно истолковать, лишь зная, к какой команде они относятся. Например, параметр « -a » можно передать не только команде man , но и команде who , и команде last , при этом значить для них он будет разное. Такого рода параметры называются модификаторами выполнения или ключами (options).
[methody@localhost methody]$ date
Вск Сен 19 23:01:17 MSD 2004
[methody@localhost methody]$ date -u
Вск Сен 19 19:01:19 UTC 2004
Пример 13. Команда date с ключом
Для решения разных задач одни и те же действия необходимо выполнять слегка по-разному. Например, для синхронизации работ в разных точках земного шара лучше использовать единое для всех время (по Гринвичу), а для организации собственного рабочего дня — местное время (с учётом сдвига по часовому поясу и разницы зимнего и летнего времени). И то, и другое время показывает команда date , только для работы по Гринвичу ей нужен дополнительный параметр-ключ « -u » (он же « —universal »).
Однобуквенные ключи
Для формата ключей нет жёсткого стандарта, однако существуют договорённости, нарушать которые в наше время уже неприлично. Во-первых, если параметр начинается на « — », это — однобуквенный ключ. За « — », как правило, следует один символ, чаще всего — буква, обозначающая действие или свойство, которое этот ключ придаёт команде. Так проще отличать ключи от других параметров — и пользователю при наборе командной строки, и программисту, автору команды.
Во-вторых, желательно, чтобы имя ключа было значащим — как правило, это первая буква названия пресловутого действия или свойства. Например, ключ « -a » в man и who происходит от слова «All» (всё), и изменяет работу этих команд так, что они начинают показывать информацию, о которой они обычно умалчивают. А в командах cal и who смысл ключа « -m » — разный:
[methody@localhost methody]$ who -m
methody tty1 Sep 20 13:56 (localhost)
[methody@localhost methody]$ cal -m
Сентября 2004
Пн Вт Ср Чт Пт Сб Вс
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Пример 14. Использование ключа « -m » в разных командах
Для who ключ « -m » означает «Me», то есть «Я», и в результате who работает похоже на whoami.
Кстати, с незапамятных времён who поддерживает один нестандартный набор параметров: who am i делает то же, что и who -m .
А для cal ключ « -m » — это команда выдать календарь, считая первым днём понедельник («Monday»), как это принято в России.
Свойство ключа быть, с одной стороны, предельно коротким, а с другой стороны — информативным, называется аббревиативностью. Не только ключи, но и имена наиболее распространённых команд Linux обладают этим свойством.
В-третьих, иногда ключ изменяет поведение команды таким образом, что меняется и толкование параметра, следующего в командной строке за этим ключом. Выглядит это так, будто ключ сам получает параметр, поэтому ключи такого вида называются параметрическими. Как правило, их параметры — имена файлов различного применения, числовые характеристики и прочие значения, которые нужно передать команде.
[methody@localhost methody]$ info info «Expert info» Cross-refs Help-Cross -o text
info: Запись ноды (info.info.bz2)Help-Cross.
info: Завершено.
[methody@localhost methody]$ cat text -n
1 File: info.info, Node: Help-Cross, Up: Cross-refs
2
3 The node reached by the cross reference in Info
4 ————————————————
. . .
Пример 15. Использование info -o
Здесь info запустилась не в качестве интерактивной программы, а как обработчик info-документа. Результат работы — текст узла info -> Expert info -> Cross-refs -> Help-Cross , программа поместила в файл text .
Странное слово «нода» Мефодий решил оставить на совести неизвестного переводчика сообщений info .
А программа cat вывела содержимое этого файла на терминал, пронумеровав все строки (по просьбе ключа « -n », «number»).
Теперь стало более-менее понятно, что означают неудобочитаемые строки в поле SYNOPSIS руководства. Например [-smjy13] из руководства по cal ($ManCal) говорит о том, что команду можно запускать с необязательными ключами « -s », « -m », « -j », « -y », « -1 » и « -3 ».
В-четвёртых, есть некоторые менее жёсткие, но популярные договорённости о значении ключей. Ключ « -h » («Help») обычно (но, увы, не всегда) заставляет команды выдать краткую справку (нечто похожее на SYNOPSIS , иногда с короткими пояснениями). Если указать « — » вместо имени выходного файла в соответствующем параметрическом ключе (нередко это ключ « -o »), вывод будет производиться на терминал.
Точнее, на стандартный вывод, см. лекцию Работа с текстовыми данными.
Наконец, бывает необходимо передать команде параметр, а не ключ, начинающийся с « — ». Для этого нужно использовать ключ « — »:
[methody@localhost methody]$ info -o -filename-with-
info: Запись ноды (dir)Top.
info: Завершено.
[methody@localhost methody]$ head -1 -filename-with-
head: invalid option — f
Попробуйте `head —help’ для получения более подробного описания.
[methody@localhost methody]$ head -1 — -filename-with-
File: dir Node: Top This is the top of the INFO tree
Пример 16. Параметр-не ключ, начинающийся на « — »
Здесь Мефодий сначала создал файл -filename-with- , а потом пытался посмотреть его первую строку (команда head -количество_строк имя_файла выводит первые количество_строк из указанного файла). Ключ « — » (первый « — » — признак ключа, второй — сам ключ) обычно запрещает команде интерпретировать все последующие параметры командной строки как ключи, независимо от того, начинаются ли они на « — » или нет. Только после « — » head согласилась с тем, что -filename-with- — это имя файла.
Полнословные ключи
Аббревиативность ключей трудно соблюсти, когда их у команды слишком много. Некоторые буквы латинского алфавита (например, « s » или « o ») используются очень часто, и могли бы служить сокращением сразу нескольких команд, а некоторые (например, « z ») — редко, под них и название-то осмысленное трудно придумать. На такой случай существует другой, полнословный формат: ключ начинается на два знака « — », за которыми следует полное имя обозначаемой им сущности. Таков, например, ключ « —help » (аналог « -h »):
[methody@localhost methody]$ head —help
Использование: head [КЛЮЧ]. [ФАЙЛ].
Print the first 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.
Аргументы, обязательные для длинных ключей, обязательны и для коротких.
-c, —bytes=[-]N print the first N bytes of each file;
with the leading `-‘, print all but the last
N bytes of each file
-n, —lines=[-]N print the first N lines instead of the first 10;
with the leading `-‘, print all but the last
N lines of each file
-q, —quiet, —silent не печатать заголовки с именами файлов
-v, —verbose всегда печатать заголовки с именами файлов
—help показать эту справку и выйти
—version показать информацию о версии и выйти
N may have a multiplier suffix: b 512, k 1024, m 1024*1024.
Об ошибках сообщайте по адресу .
Пример 17. Ключ–help
Мефодий сделал то, о чём просила его утилита head . Видно, что некоторые ключи head имеют и однобуквенный, и полнословный формат, а некоторые — только полнословный. Так обычно и бывает: часто используемые ключи имеют аббревиатуру, а редкие — нет. Значения параметрических полнословных ключей принято передавать не следующим параметром командной строки, а с помощью конструкции « =значение » непосредственно после ключа.
Источник
Команды Linux: расширенный справочник команд Unix / Linux / PuTTY SSH
Большинство UNIX-like систем обладают встроенной справкой, которая подробно описывает все доступные команды. Однако чтобы воспользоваться этой справкой, вы должны знать, по крайней мере, название команды, о которой вы хотите получить информацию. Поскольку большинство пользователей только в общих чертах понимают, что они хотят сделать, то, как правило, встроенная справка мало полезна новичкам.
Этот справочник поможет пользователям, знающим, что они хотят сделать, найти соответствующую команду Linux по краткому описанию.
- Системная информация
- Остановка системы
- Файлы и директории
- Поиск файлов
- Монтирование файловых систем
- Дисковое пространство
- Пользователи и группы
- Выставление/изменение полномочий на файлы
- Специальные атрибуты файлов
- Архивирование и сжатие файлов
- RPM пакеты (Fedora, Red Hat и тому подобное)
- YUM — средство обновления пакетов(Fedora, RedHat и тому подобное)
- DEB пакеты (Debian, Ubuntu и тому подобное)
- APT — средство управление пакетами (Debian, Ubuntu и тому подобное)
- Pacman — средство управление пакетами (Arch, Frugalware и alike)
- Просмотр содержимого файлов
- Манипуляции с текстом
- Преобразование наборов символов и файловых форматов
- Анализ файловых систем
- Форматирование файловых систем
- swap-пространство
- Создание резервных копий (backup)
- CDROM
- Сеть (LAN и WiFi)
- Microsoft Windows networks(SAMBA)
- IPTABLES (firewall)
- Мониторинг и отладка
- Другие полезные команды
Системная информация: arch или uname -m — отобразить архитектуру компьютера uname -r — отобразить используемую версию ядра dmidecode -q — показать аппаратные системные компоненты — (SMBIOS / DMI) hdparm -i /dev/hda — вывести характеристики жёсткого диска hdparm -tT /dev/sda — протестировать производительность чтения данных с жёсткого диска cat /proc/cpuinfo — отобразить информацию о процессоре cat /proc/interrupts — показать прерывания cat /proc/meminfo — проверить использование памяти cat /proc/swaps — показать файл(ы) подкачки cat /proc/version — вывести версию ядра cat /proc/net/dev — показать сетевые интерфейсы и статистику по ним cat /proc/mounts — отобразить смонтированные файловые системы lspci -tv — показать в виде дерева PCI устройства lsusb -tv — показать в виде дерева USB устройства date — вывести системную дату cal 2007 — вывести таблицу-календарь 2007-го года date 041217002007.00* — установить системные дату и время ММДДЧЧммГГГГ.СС (МесяцДеньЧасМинутыГод.Секунды) clock -w — сохранить системное время в BIOS Остановка системы: shutdown -h now или init 0 или telinit 0 — остановить систему shutdown -h hours:minutes & — запланировать остановку системы на указанное время shutdown -c — отменить запланированную по расписанию остановку системы shutdown -r now или reboot — перегрузить систему logout — выйти из системы Файлы и директории: cd /home — перейти в директорию ‘/home’ cd .. — перейти в директорию уровнем выше cd ../.. — перейти в директорию двумя уровнями выше cd — перейти в домашнюю директорию cd
Источник
Bash-скрипты, часть 3: параметры и ключи командной строки
Освоив предыдущие части этой серии материалов, вы узнали о том, что такое bash-скрипты, как их писать, как управлять потоком выполнения программы, как работать с файлами. Сегодня мы поговорим о том, как добавить скриптам интерактивности, оснастив их возможностями по получению данных от пользователя и по обработке этих данных.
Наиболее распространённый способ передачи данных сценариям заключается в использовании параметров командной строки. Вызвав сценарий с параметрами, мы передаём ему некую информацию, с которой он может работать. Выглядит это так:
В данном примере сценарию передано два параметра — «10» и «20». Всё это хорошо, но как прочесть данные в скрипте?
Чтение параметров командной строки
Оболочка bash назначает специальным переменным, называемым позиционными параметрами, введённые при вызове скрипта параметры командной строки:
- $0 — имя скрипта.
- $1 — первый параметр.
- $2 — второй параметр — и так далее, вплоть до переменной $9 , в которую попадает девятый параметр.
Вот как можно использовать параметры командной строки в скрипте с помощью этих переменных:
Запустим сценарий с параметрами:
Вот что он выведет в консоль.
Вывод параметров, с которыми запущен скрипт
Обратите внимание на то, что параметры командной строки разделяются пробелами.
Взглянем на ещё один пример использования параметров. Тут мы найдём сумму чисел, переданных сценарию:
Запустим скрипт и проверим результат вычислений.
Сценарий, который находит сумму переданных ему чисел
Параметры командной строки не обязательно должны быть числами. Сценариям можно передавать и строки. Например, вот скрипт, работающий со строкой:
Он выведет то, что мы от него ожидаем.
Сценарий, работающий со строковым параметром
Что если параметр содержит пробелы, а нам надо обрабатывать его как самостоятельный фрагмент данных? Полагаем, если вы освоили предыдущие части этого руководства, ответ вы уже знаете. Заключается он в использовании кавычек.
Если скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например так:
Проверка параметров
Если скрипт вызван без параметров, но для нормальной работы кода предполагается их наличие, возникнет ошибка. Поэтому рекомендуется всегда проверять наличие параметров, переданных сценарию при вызове. Например, это можно организовать так:
Вызовем скрипт сначала с параметром, а потом без параметров.
Вызов скрипта, проверяющего наличие параметров командной строки
Подсчёт параметров
В скрипте можно подсчитать количество переданных ему параметров. Оболочка bash предоставляет для этого специальную переменную. А именно, переменная $# содержит количество параметров, переданных сценарию при вызове.
В результате скрипт сообщит о том, что ему передано 5 параметров.
Подсчёт количества параметров в скрипте
Эта переменная даёт необычный способ получения последнего из переданных скрипту параметров, не требующий знания их количества. Вот как это выглядит:
Вызовем скрипт и посмотрим, что он выведет.
Обращение к последнему параметру
Захват всех параметров командной строки
В некоторых случаях нужно захватить все параметры, переданные скрипту. Для этого можно воспользоваться переменными $* и $@ . Обе они содержат все параметры командной строки, что делает возможным доступ к тому, что передано сценарию, без использования позиционных параметров.
Переменная $* содержит все параметры, введённые в командной строке, в виде единого «слова».
В переменной $@ параметры разбиты на отдельные «слова». Эти параметры можно перебирать в циклах.
Рассмотрим разницу между этими переменными на примерах. Сначала взглянем на их содержимое:
Вот вывод скрипта.
Как видно, при выводе обеих переменных получается одно и то же. Теперь попробуем пройтись по содержимому этих переменных в циклах для того, чтобы увидеть разницу между ними:
Взгляните на то, что скрипт вывел в консоль. Разница между переменными вполне очевидна.
Разбор переменных $* и $@ в цикле
Переменная $* содержит все переданные скрипту параметры как единый фрагмент данных, в то время как в переменной $@ они представлены самостоятельными значениями. Какой именно переменной воспользоваться — зависит от того, что именно нужно в конкретном сценарии.
Команда shift
Использовать команду shift в bash-скриптах следует с осторожностью, так как она, в прямом смысле слова, сдвигает значения позиционных параметров.
Когда вы используете эту команду, она, по умолчанию, сдвигает значения позиционных параметров влево. Например, значение переменной $3 становится значением переменной $2 , значение $2 переходит в $1 , а то, что было до этого в $1, теряется. Обратите внимание на то, что при этом значение переменной $0 , содержащей имя скрипта, не меняется.
Воспользовавшись командой shift , рассмотрим ещё один способ перебора переданных скрипту параметров:
Скрипт задействует цикл while , проверяя длину значения первого параметра. Когда длина станет равна нулю, происходит выход из цикла. После проверки первого параметра и вывода его на экран, вызывается команда shift , которая сдвигает значения параметров на одну позицию.
Использование команды shift для перебора параметров
Используя команду shift , помните о том, что при каждом её вызове значение переменной $1 безвозвратно теряется.
Ключи командной строки
Ключи командной строки обычно выглядят как буквы, перед которыми ставится тире. Они служат для управления сценариями. Рассмотрим такой пример:
И проанализируем то, что он выведет в терминал.
Обработка ключей в скрипте
В этом коде использована конструкция case , которая сверяет переданный ей ключ со списком обрабатываемых скриптом ключей. Если переданное значение нашлось в этом списке, выполняется соответствующая ветвь кода. Если при вызове скрипта будет использован любой ключ, обработка которого не предусмотрена, будет исполнена ветвь «*».
Как различать ключи и параметры
Часто при написании bash-скриптов возникает ситуация, когда надо использовать и параметры командной строки, и ключи. Стандартный способ это сделать заключается в применении специальной последовательности символов, которая сообщает скрипту о том, когда заканчиваются ключи и начинаются обычные параметры.
Эта последовательность — двойное тире (—). Оболочка использует её для указания позиции, на которой заканчивается список ключей. После того, как скрипт обнаружит признак окончания ключей, то, что осталось, можно, не опасаясь ошибок, обрабатывать как параметры, а не как ключи. Рассмотрим пример:
Этот сценарий использует команду break для прерывания цикла while при обнаружении в строке двойного тире.
Вот что получится после его вызова.
Обработка ключей и параметров командной строки
Как видно, когда скрипт, разбирая переданные ему данные, находит двойное тире, он завершает обработку ключей и считает всё, что ещё не обработано, параметрами.
Обработка ключей со значениями
По мере усложнения ваших скриптов, вы столкнётесь с ситуациями, когда обычных ключей уже недостаточно, а значит, нужно будет использовать ключи с некими значениями. Например, вызов сценария в котором используется подобная возможность, выглядит так:
Скрипт должен уметь определять, когда вместе с ключами командной строки используются дополнительные параметры:
Вызовем этот скрипт в таком виде:
Посмотрим на результаты его работы.
Обработка параметров ключей
В данном примере в конструкции case обрабатываются три ключа. Ключ -b требует наличия дополнительного параметра. Так как обрабатываемый ключ находится в переменной $1 , соответствующий ему параметр будет находиться в $2 (тут используется команда shift , поэтому, по мере обработки, всё, что передано сценарию, сдвигается влево). Когда с этим мы разобрались, осталось лишь извлечь значение переменной $2 и у нас будет параметр нужного ключа. Конечно, тут понадобится ещё одна команда shift для того, чтобы следующий ключ попал в $1 .
Использование стандартных ключей
При написании bash-скриптов вы можете выбирать любые буквы для ключей командной строки и произвольно задавать реакцию скрипта на эти ключи. Однако, в мире Linux значения некоторых ключей стали чем-то вроде стандарта, которого полезно придерживаться. Вот список этих ключей:
-a Вывести все объекты.
-c Произвести подсчёт.
-d Указать директорию.
-e Развернуть объект.
-f Указать файл, из которого нужно прочитать данные.
-h Вывести справку по команде.
-i Игнорировать регистр символов.
-l Выполнить полноформатный вывод данных.
-n Использовать неинтерактивный (пакетный) режим.
-o Позволяет указать файл, в который нужно перенаправить вывод.
-q Выполнить скрипт в quiet-режиме.
-r Обрабатывать папки и файлы рекурсивно.
-s Выполнить скрипт в silent-режиме.
-v Выполнить многословный вывод.
-x Исключить объект.
-y Ответить «yes» на все вопросы.
Если вы работаете в Linux, вам, скорее всего, знакомы многие из этих ключей. Использовав их в общепринятом значении в своих скриптах, вы поможете пользователям взаимодействовать с ними, не беспокоясь о чтении документации.
Получение данных от пользователя
Ключи и параметры командной строки — это отличный способ получить данные от того, кто пользуется скриптом, однако в некоторых случаях нужно больше интерактивности.
Иногда сценарии нуждаются в данных, которые пользователь должен ввести во время выполнения программы. Именно для этой цели в оболочке bash имеется команда read .
Эта команда позволяет принимать введённые данные либо со стандартного ввода (с клавиатуры), либо используя другие дескрипторы файлов. После получения данных, эта команда помещает их в переменную:
Обратите внимание на то, что команда echo , которая выводит приглашение, вызывается с ключом -n . Это приводит к тому, что в конце приглашения не выводится знак перевода строки, что позволяет пользователю скрипта вводить данные там же, где расположено приглашение, а не на следующей строке.
Обработка пользовательского ввода
При вызове read можно указывать и несколько переменных:
Вот что выведет скрипт после запуска.
Несколько переменных в команде read
Если, вызвав read , не указывать переменную, данные, введённые пользователем, будут помещены в специальную переменную среды REPLY :
Использование переменной среды REPLY
Если скрипт должен продолжать выполнение независимо от того, введёт пользователь какие-то данные или нет, вызывая команду read можно воспользоваться ключом -t . А именно, параметр ключа задаёт время ожидания ввода в секундах:
Если данные не будут введены в течение 5 секунд, скрипт выполнит ветвь условного оператора else , выведя извинения.
Ограничение времени на ввод данных
Ввод паролей
Иногда то, что вводит пользователь в ответ на вопрос скрипта, лучше на экране не показывать. Например, так обычно делают, запрашивая пароли. Ключ -s команды read предотвращает отображение на экране данных, вводимых с клавиатуры. На самом деле, данные выводятся, но команда read делает цвет текста таким же, как цвет фона.
Вот как отработает этот скрипт.
Ввод конфиденциальных данных
Чтение данных из файла
Команда read может, при каждом вызове, читать одну строку текста из файла. Когда в файле больше не останется непрочитанных строк, она просто остановится. Если нужно получить в скрипте всё содержимое файла, можно, с помощью конвейера, передать результаты вызова команды cat для файла, конструкции while , которая содержит команду read (конечно, использование команды cat выглядит примитивно, но наша цель — показать всё максимально просто, ориентируясь на новичков; опытные пользователи, уверены, это поймут).
Напишем скрипт, в котором используется только что описанный подход к чтению файлов.
Посмотрим на него в деле.
Чтение данных из файла
Тут мы передали в цикл while содержимое файла и перебрали все строки этого файла, выводя номер и содержимое каждой из них.
Итоги
Сегодня мы разобрали работу с ключами и параметрами командной строки. Без этих средств диапазон использования скриптов оказывается чрезвычайно узким. Даже если скрипт написан, что называется, «для себя». Тут же мы рассмотрели подходы к получению данных от пользователя во время выполнения программы — это делает сценарии интерактивными.
В следующий раз поговорим об операциях ввода и вывода.
Уважаемые читатели! Спасибо вам за то, что делитесь опытом в комментариях к предыдущим частям этого цикла материалов. Если вам есть что сказать об обработке всего того, что можно передать в скрипт при запуске или во время его работы, уверены, многим будет интересно об этом почитать.
Источник