- Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
- Глава 10. Команды и аргументы
- Аргументы
- Удаление пробелов
- Одинарные кавычки
- Двойные кавычки
- Команда echo и кавычки
- Команды
- Псевдонимы команд
- Вывод информации о раскрытии команд командной оболочкой
- Практическое задание: команды и аргументы
- Корректная процедура выполнения практического задания: команды и аргументы
- Основы BASH. Часть 1
- Введение
- Что необходимо знать с самого начала
- Переменные и параметры скрипта
- Условия
- Условия. Множественный выбор
Фундаментальные основы 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 для вывода трех слов в трех строках.
Источник
Основы BASH. Часть 1
Введение
break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.
И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе
Что необходимо знать с самого начала
1. Любой bash-скрипт должен начинаться со строки:
#!/bin/bash
в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash) поменяйте её на ваш путь.
2. Коментарии начинаются с символа # (кроме первой строки).
3. В bash переменные не имеют типа(о них речь пойдет ниже)
Переменные и параметры скрипта
Приведу как пример небольшой пример, который мы разберем:
#!/bin/bash
#указываем где у нас хранится bash-интерпретатор
parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта
script_name=$0 #присваиваем переменной script_name значение имени скрипта
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1» # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’ # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
exit 0 #Выход с кодом 0 (удачное завершение работы скрипта)
Результат выполнения скрипта:
$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1
После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:
$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта
Условия
Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере):
#!/bin/bash
source=$1 #в переменную source засовываем первый параметр скрипта
dest=$2 #в переменную dest засовываем второй параметр скрипта
if [[ «$source» -eq «$dest» ]] # в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
then # если они действительно равны, то
echo «Применик $dest и источник $source один и тот же файл!» #выводим сообщение об ошибке, т.к. $source и $dest у нас равны
exit 1 # выходим с ошибкой (1 — код ошибки)
else # если же они не равны
cp $source $dest # то выполняем команду cp: копируем источник в приемник
echo «Удачное копирование!»
fi #обозначаем окончание условия.
Результат выполнения скрипта:
ite@ite-desktop:
$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!
ite@ite-desktop:
$ ./primer2.sh 1 2
Удачное копирование!
Структура if-then-else используется следующим образом:
if
then
else
В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.
test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.
для построения многоярусных условий вида:
if .
then .
else
if .
then.
else .
для краткости и читаемости кода, можно использовать структуру:
if ..
then .
elif .
then .
elif .
Условия. Множественный выбор
Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.
#!/bin/bash
echo «Выберите редатор для запуска:»
echo «1 Запуск программы nano»
echo «2 Запуск программы vi»
echo «3 Запуск программы emacs»
echo «4 Выход»
read doing #здесь мы читаем в переменную $doing со стандартного ввода
case $doing in
1)
/usr/bin/nano # если $doing содержит 1, то запустить nano
;;
2)
/usr/bin/vi # если $doing содержит 2, то запустить vi
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить emacs
;;
4)
exit 0
;;
*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
echo «Введено неправильное действие»
esac #окончание оператора case.
Результат работы:
ite@ite-desktop:
$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход
После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )
Прведу список логических операторв, которые используются для конструкции if-then-else-fi:
-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( ) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»
С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.
UPD: Исправил некоторые ошибки
UPD: Обновил часть про условия if-then-else
Источник