- Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
- Глава 10. Команды и аргументы
- Аргументы
- Удаление пробелов
- Одинарные кавычки
- Двойные кавычки
- Команда echo и кавычки
- Команды
- Псевдонимы команд
- Вывод информации о раскрытии команд командной оболочкой
- Практическое задание: команды и аргументы
- Корректная процедура выполнения практического задания: команды и аргументы
- Аргументы командной строки в Linux
- Использование переменных аргументов:
- Пример 1: отправка трех числовых значений в аргументы командной строки
- Пример 2: использование имени файла в качестве аргумента
- Использование функции getopts:
- Пример 3: Чтение аргументов функцией getopts
- Пример 4: Чтение обычных аргументов и аргументов с помощью параметров getopts
- Использование ‘$@’ для чтения аргументов командной строки:
- Пример 5: Чтение значений аргументов командной строки без переменной
- Заключение:
- Аргументы командной строки Bash
- Параметры скрипта Bash
- Получение названия скрипта Bash
- Проверка параметров скрипта
- Обработка неизветсного числа параметров
- Обработка опций в Bash
- Выводы
Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
Глава 10. Команды и аргументы
В данной главе вашему вниманию представляется обзор механизма раскрытия команд командной оболочки (shell expansion), созданный в ходе подробного рассмотрения методик обработки команд и аргументов . Понимание принципа работы механизма раскрытия команд командной оболочки является важным ввиду того, что многие команды в вашей системе Linux подвергаются обработке и с высокой вероятностью последующей модификации средствами командной оболочки перед исполнением.
Интерфейс командной строки системы или командная оболочка , используемая в большинстве систем Linux, носит имя bash , которое расшифровывается как Bourne again shell (название «Born again shell» — «возрожденная командная оболочка» было изменено с целью упоминания автора оригинальной командной оболочки sh Стивена Борна). Командная оболочка bash реализует возможности командных оболочек sh (оригинальная командная оболочка Стивена Борна), csh (командная оболочка Билла Джоя с поддержкой сценариев, синтаксис которых основан на синтаксисе языка программирования C), а также ksh (командная оболочка Дэвида Корна).
Аргументы
Одной из важнейших возможностей командной оболочки является возможность обработки строк команд . При вводе команды после приглашения командной оболочки и нажатии клавиши Enter командная оболочка приступает к обработке строки команды, разделяя ее на аргументы . При обработке строки команды командная оболочка может внести множество изменений в переданные вами аргументы .
Данный процесс называется раскрытием команд командной оболочки . После того, как командная оболочка заканчивает обработку и модификацию переданной строки команды, будет осуществляться непосредственное исполнение результирующей команды.
Удаление пробелов
Части строки команды, которые разделены с помощью одного или нескольких последовательно расположенных символов пробелов (или табуляции), рассматриваются как отдельные аргументы , причем все пробелы удаляются. Первым аргументом является сама команда, которая должна быть исполнена, остальные аргументы передаются этой команде. Фактически командная оболочка производит разделение вашей строки команды на один или несколько аргументов.
Команда echo будет выводить каждый из принятых от командной оболочки аргументов. Также команда echo осуществляет добавление пробелов между всеми принятыми аргументами.
Одинарные кавычки
Двойные кавычки
Позднее при обсуждении переменных в рамках данной книги мы разберемся с важными различиями между одинарными и двойными кавычками.
Команда echo и кавычки
Команда echo может генерировать и другие символы помимо символов пробелов, табуляции и переноса строки. Обратитесь к странице руководства для ознакомления со списком допустимых обозначений символов.
Команды
Внешние или встроенные команды?
Не все исполняемые командной оболочкой команды являются внешними ; некоторые из них являются встроенными . Внешние команды реализованы в форме программ, представленных отдельными бинарными файлами, которые размещены в какой-либо директории файловой системы. Многие бинарные фалы, реализующие функции внешних команд, размещаются в директории /bin или /sbin . Встроенные команды являются неотъемлемой частью самого приложения командной оболочки.
Как вы можете заметить, команда cd является встроенной , а команда cat — внешней .
Исполнение внешних команд
Псевдонимы команд
Создание псевдонима команды
Стандартные параметры команд
В некоторых дистрибутивах используются стандартные псевдонимы команд для защиты пользователей от случайного удаления файлов (‘rm -i’, ‘mv -i’, ‘cp -i’).
Просмотр объявлений псевдонимов команд
Вывод информации о раскрытии команд командной оболочкой
Практическое задание: команды и аргументы
2. Является ли команда tac встроенной?
3. Существует ли действующий псевдоним команды rm ?
4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .
5. Выполните команду: alias rm=’rm -i’ . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?
6. Выведите список используемых на данный момент псевдонимов команд.
7a. Создайте псевдоним команды ‘city’, позволяющий вывести название вашего города.
7b. Используйте ваш псевдоним команды для того, чтобы убедиться в его работоспособности.
8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.
9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .
10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.
11. Удалите созданный ранее псевдоним команды city.
12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?
15. Выведите строку «A B C» с двумя пробелами между буквами B и C.
Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).
18. Используйте одну команду echo для вывода трех слов в трех строках.
Корректная процедура выполнения практического задания: команды и аргументы
Ответ: три аргумента
2. Является ли команда tac встроенной?
3. Существует ли действующий псевдоним команды rm ?
4. Прочитайте страницу руководства для команды rm и убедитесь в том, что вы поняли предназначение параметра -i этой команды. Создайте и удалите файл для проверки работоспособности параметра -i .
5. Выполните команду: alias rm=’rm -i’ . Проверьте работоспособность вашего псевдонима команды на тестовом файле. Работает ли он так, как ожидается?
6. Выведите список используемых на данный момент псевдонимов команд.
7a. Создайте псевдоним команды ‘city’, позволяющий вывести название вашего города.
7b. Используйте ваш псевдоним команды для того, чтобы убедиться в его работоспособности.
8. Выполните команду set -x для активации режима вывода информации о раскрытии каждой из команд командной оболочкой.
9. Проверьте работоспособность команды set -x , воспользовавшись созданными ранее псевдонимами команд city и rm .
10. Выполните команду set +x для прекращения вывода информации о раскрытии команд командной оболочкой.
11. Удалите созданный ранее псевдоним команды city.
12. В каких директориях расположены бинарные файлы, являющиеся реализациями команд cat и passwd ?
После интерпретации команды echo командной оболочкой будет задействована встроенная реализация команды echo . Ввод команды /bin/echo приведет к исполнению бинарного файла echo , расположенного в директории /bin .
Параметр -n команды echo предназначен для предотвращения вывода символа перехода на новую строку в конце переданной строки. Команда echo Hello выведет в общей сложности шесть символов, а команда echo -n Hello — только пять символов.
(Параметр -n может не работать в командной оболочке Korn shell).
15. Выведите строку «A B C» с двумя пробелами между буквами B и C.
Найдите два решения с использованием одинарных кавычек, два решения с использованием двойных кавычек и одно решение без использования кавычек (и поблагодарите Rene и Darioush из компании Google за это дополнение).
18. Используйте одну команду echo для вывода трех слов в трех строках.
Источник
Аргументы командной строки в Linux
Главное меню » Linux » Аргументы командной строки в Linux
Использование переменных аргументов:
Переменная аргумента начинается с $ 0. Имя основного файла сценария хранится в $ 0, который получает значения аргументов из аргументов командной строки. Если в командной строке передаются два аргумента, то последовательно значения аргументов будут получены в переменных $ 1 и $ 2.
Пример 1: отправка трех числовых значений в аргументы командной строки
Создайте файл bash со следующим сценарием. Сценарий получит значения с тремя аргументами и сохранит их в переменных $ 1, $ 2 и $ 3. Он будет подсчитывать общее количество аргументов и выводить значения аргументов, используя цикл без цикла. Сумма всех значений аргументов будет напечатана позже.
Следующий вывод появится после выполнения файла сценария с тремя числовыми значениями аргументов: 50, 35 и 15.
Пример 2: использование имени файла в качестве аргумента
Создайте файл bash с помощью следующего сценария, чтобы подсчитать общее количество символов в любом файле. Здесь имя файла будет передано как аргумент командной строки.
Запустите сценарий bash с именем файла в качестве значения одного аргумента и запустите другую команду, чтобы проверить общее количество символов в этом файле. Здесь в качестве значения аргумента используется файл weekday.txt. Общее количество символов в файле weekday.txt – 57.
Использование функции getopts:
Если вы хотите сохранить данные в базе данных или любом файле или создать отчет в определенном формате на основе значений аргументов командной строки, то функция getopts – лучший вариант для выполнения этой задачи. Это встроенная функция Linux. Таким образом, вы можете легко использовать эту функцию в своем скрипте для чтения форматированных данных из командной строки.
Пример 3: Чтение аргументов функцией getopts
Создайте файл bash со следующим сценарием, чтобы понять использование функции getopts. Функция getopts используется с циклом while для чтения параметров аргументов командной строки и значений аргументов. Здесь используются 4 варианта: «i», «n», «m» и «e». оператор case используется для сопоставления конкретной опции и сохранения значения аргумента в переменной. Наконец, распечатайте значения переменной.
Запустите файл со следующими параметрами и значениями аргументов. Здесь p100 – значение опции -i, «Hot Cake» – значение опции -n, « 01-10-2021 » – значение опции -m, а «05-10-2021 » – значение – е вариант.
Когда вам нужно отправить простые значения в скрипте, лучше использовать переменные аргумента. Но если вы хотите отправлять данные в формате, лучше использовать функцию getopts для получения значений аргументов. Использование переменных аргументов и параметров getopts показано в следующем примере.
Пример 4: Чтение обычных аргументов и аргументов с помощью параметров getopts
Способы чтения аргументов командной строки с использованием переменных аргументов и параметров getopts были показаны отдельно в предыдущих примерах этой статьи. Но эти два способа можно использовать в одном скрипте для чтения значений аргументов командной строки. Создайте сценарий bash со следующим кодом для чтения значений аргументов командной строки, передаваемых параметрами getopts и параметрами аргументов. Здесь три параметра getopts были использованы для чтения имени хоста, имени пользователя и пароля командной строки. Затем была использована команда shift для удаления всех параметров getopts из команды чтения значений командной строки с использованием переменных аргументов. Этот сценарий прочитает и распечатает не более трех значений переменных аргументов. Если после выполнения кода не будет указано значение аргумента без опции, то будет напечатано сообщение; иначе,
Использование ‘$@’ для чтения аргументов командной строки:
Аргументы командной строки можно прочитать без использования переменных аргументов или параметров getopts. Использование символа «$@» в первой скобке – еще один способ прочитать все значения аргументов командной строки.
Пример 5: Чтение значений аргументов командной строки без переменной
Создайте файл bash со следующим сценарием, чтобы прочитать значения аргументов без какой-либо переменной аргумента и вычислить сумму трех значений аргументов командной строки. Здесь в первых скобках используется «$@» для считывания всех значений аргументов в массив. Затем будет напечатана сумма первых трех значений массива.
В выводе появится после выполнения вышеуказанного сценария для значений аргументов 12, 20 и 90. Сумма этих чисел равна 122.
Заключение:
Здесь показаны способы предоставления значений аргументов командной строки без каких-либо параметров и с параметрами. Здесь также показан способ чтения значений аргументов командной строки без использования переменных. Мы надеемся, что эта статья поможет читателям правильно использовать значения аргументов командной строки в своих сценариях bash.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Аргументы командной строки Bash
Функциональность интерпретатора Bash позволяет работать не только со статистическими данными, записанными в скриптах. Иногда возникает необходимость добавить сценарию интерактивности, позволяя принимать внешние параметры скрипта для манипуляции ими в коде.
В этой статье будет рассмотрено, как принимать аргументы командной строки bash, способы его обработки, проверка опций, а также известные особенности при работе с ними.
Параметры скрипта Bash
Интерпретатор Bash присваивает специальным переменным все параметры, введённые в командной строке. В их состав включено название сценария, выполняемого интерпретатором. Такие переменные называются ещё числовыми переменными, так как в их названии содержится число:
- $0 — название сценария;
- $1 — первый параметр;
- .
- $9 — девятый параметр сценария.
Ниже приведён пример использования одного параметра скрипта Bash:
#!/bin/bash
factorial=1
for (( number = 1; number
Результат работы кода:
Переменная $1 может использоваться в коде точно так же, как и любая другая. Скрипт автоматически присваивает ей значение из параметра командой строки — пользователю не нужно делать это вручную.
Если необходимо ввести дополнительные параметры, их следует разделить в командной строке пробелами.
#!/bin/bash
total=$[ $1 * $2 ]
echo «Первый параметр равен $1.»
echo «Второй параметр равен $2.»
echo «Произведение параметров равно $total.»
Пример работы кода:
Командный интерпретатор присвоил числа 5 и 10 соответствующим переменным — $1 и $2.
Также параметрами могут быть и текстовые строки. Однако, если есть необходимость передать параметр, содержащий пробел (например имя и фамилию), его нужно заключить в одинарные или двойные кавычки, так как по умолчанию пробел служит разделителем параметров командной строки:
#!/bin/bash
echo «Добро пожаловать, $1»
Пример работы кода:
На заметку: кавычки, которые используются при передаче параметров, обозначают начало и конец данных и не являются их частью.
Если необходимо использовать больше 9 параметров для скрипта, то названия переменных немного изменятся. Начиная с десятой переменной, число, стоящее после знака $, необходимо заключать в квадратные скобки (без внутренних пробелов):
#!/bin/bash
total=$[ $ <10>* $ <11>]
echo «Десятый параметр равен $<10>»
echo «Одиннадцатый параметр равен $<11>»
echo «Произведение этих параметров равно $total»
Пример работы кода:
Получение названия скрипта Bash
Как уже упоминалось, имя сценария является самым первым параметром скрипта. Чтобы определить название программы, используется переменная $0. Такая необходимость возникает, например, при написании скрипта, который может выполнять несколько функций. Однако при этом возникает одна особенность, которую нужно учитывать на практике:
#!/bin/bash
echo «Имя сценария: $0»
Пример работы кода:
Как видно, если строкой, фактически переданной в переменную $0, является весь путь к сценарию, то на вывод будет идти весь путь, а не только название программы.
Если нужен скрипт, выполняющий различные функции с учётом того, под каким именем он был вызван из командной строки, придётся проделать дополнительную работу: удалить сведения о пути, который использовался для его вызова.
Для этого специально предусмотрена небольшая команда. Команда basename возвращает только название скрипта без абсолютного или относительного пути к нему:
#!/bin/bash
name=`basename $0`
echo «Имя запущенной программы: $name»
Результат работы кода:
Проверка параметров скрипта
Передача параметров Bash вынуждает соблюдать осторожность. Если сценарий написан с применением параметров, но запускается без них, то возникнут проблемы в работе программы.
Если попробовать запустить написанный ранее скрипт test2 без аргументов, то перед выводом команд echo будет отображена ошибка:
Чтобы предотвращать подобные ситуации, необходимо действовать на упреждение — проверять аргументы скрипта на наличие значений. Это настоятельная рекомендация при использовании параметров в командной строке, и только после ревизии стоит пускать их в дело:
#!/bin/bash
if [ -n «$1» ]
then
echo «Добро пожаловать, $1»
else
echo «Простите, вы не представились»
fi
Пример работы кода:
В данном случае использовалась опция -n из предыдущей статьи о сравнении строк в Bash для проверки на наличие значения в переменной, которая считала параметр.
Обработка неизветсного числа параметров
Для начала рассмотрим один из часто используемых инструментов при работе с параметрами Bash — команду shift. Её прямое назначение заключается в сдвиге параметров на одну позицию влево. Таким образом, значение из переменной $3 переместится в $2, а из $2 — в $1. Но из $1 значение просто отбросится и не сместится в $0, так как там неизменно хранится название запущенной программы.
Эта команда является эффективным способом обработки всех параметров, переданных сценарию, особенно, когда нельзя заранее узнать их количество. Достаточно лишь обработать $1, сделать сдвиг и повторить процедуру.
#!/bin/bash
count=1
while [ -n «$1» ]
do
echo «Параметр №$count = $1»
count=$[ $count + 1 ]
shift
done
Пример работы кода:
Этот скрипт выполняет цикл while, в условии которого указана проверка первого параметра на длину. И если она равна нулю, цикл прерывает свою работу. При положительном результате проверки команда shift сдвигает все параметры влево на одну позицию.
Ещё один вариант использование shift — смещать на несколько позиций. Для этого достаточно через пробел указать количество, на которое будет смещён ряд параметров скрипта.
#!/bin/bash
echo «Первый параметр из переданных: $1»
shift 2
echo «Теперь первый параметр: $1»
Пример работы скрипта:
На заметку: при использовании shift нужно быть осторожным, ведь сдвинутые за пределы $1 параметры не восстанавливаются в период работы программы.
Обработка опций в Bash
Помимо параметров скрипт может принимать опции — значения, состоящие из одной буквы, перед которыми пишется дефис. Рассмотрим 3 метода работы с ними в скриптах. Сперва кажется, что при работе с опциями не должно возникать каких-либо сложностей. Они должны быть заданы после имени запускаемой программы, как и параметры. При необходимости можно сделать обработку опций командной строки по такому же принципу, как это делается с параметрами.
По примеру выше можно применять shift для обработки простых опций. С помощью инструкции case можно определять, являются ли аргументы Bash опциями:
#!/bin/bash
while [ -n «$1» ]
do
case «$1» in
-a | -b | -c) echo «Найдена опция $1» ;;
*) echo «$1 не опция» ;;
esac
shift
done
Пример работы программы:
Блок case работает правильно вне зависимости от того, как расположены аргументы командной строки bash.
Выводы
Для того, чтобы сделать свою программу более интерактивной, можно использовать параметры Bash. Встроенные переменные, в названиях которых фигурирует число, обозначают порядок указанных для программы параметров.
Команда basename используется для обрезания пути запущенного сценария, что часто необходимо для создания гибких программ. Использование команды shift позволяет эффективно проходить по переданным скрипту параметрам, особенно когда их количество неизвестно.
Источник