Что такое let linux

Фундаментальные основы Linux. Часть VI. Сценарии

Глава 24. Дополнительная информация о сценариях

Команда eval

Оператор (( ))

Команда let

Оператор case

Функции сценариев командной оболочки

Практическое задание: дополнительная информация о сценариях

2. Доработайте созданный сценарий таким образом, чтобы он осуществлял проверку нахождения чисел в диапазоне между 1 и 100 и завершал работу с выводом сообщения об ошибке при необходимости.

3. Доработайте созданный сценарий таким образом, чтобы при равенстве суммы и произведения чисел выводилось поздравление для пользователя.

4. На основе использующего конструкцию case и рассмотренного в главе сценария, разработайте сценарий, не учитывающий регистр символов строк, воспользовавшись для этого параметром shopt nocasematch. Значение параметра nocasematch должно сбрасываться к установленному перед запуском сценария значению.

5. Если позволяет время (или вы ожидаете, пока остальные студенты закончат выполнение данного практического задания), рассмотрите системные сценарии Linux из директорий /etc/init.d и /etc/rc.d и попытайтесь понять их. В кокой точке начинается исполнение сценария /etc/init.d/samba? Некоторые скрытые файлы сценариев также находятся в директории

, но о них мы поговорим позднее.

Корректная процедура выполнения практического задания: дополнительная информация о сценариях

2. Доработайте созданный сценарий таким образом, чтобы он осуществлял проверку нахождения чисел в диапазоне между 1 и 100 и завершал работу с выводом сообщения об ошибке при необходимости.

3. Доработайте созданный сценарий таким образом, чтобы при равенстве суммы и произведения чисел выводилось поздравление для пользователя.

4. На основе использующего конструкцию case и рассмотренного в главе сценария, разработайте сценарий, не учитывающий регистр символов строк, воспользовавшись для этого параметром shopt nocasematch. Значение параметра nocasematch должно сбрасываться к установленному перед запуском сценария значению.

Источник

let command in Linux with Examples

The let command is used to evaluate arithmetic expressions on shell variables.

Syntax:

Options:

    Basic arithmetic operators : The addition(+), subtraction(-), multiplication(*), division(/) and modulus(%) operators can be used in the expression with the let command.

Example:

      Post-increment(var++) / Post-decrement(var–) operator : This operator is used to interpret the integer value then increase/decrease the integer variable by 1.
      Example:

    In the above example, myvar2 gets the value of myvar2 before the increment occurs.
    Pre-increment(++var) / Pre-decrement(–var) operator : This operator increases/decreases the integer value by 1 and then interpret the integer variable.
    Example:

    In the above example, the change in value occurs first then the value gets stored in myvar2.
    Unary plus(+exp) / Unary minus(-exp) : This operator is used to multiply a given expression by 1 or -1.

    Example:

    In the above example, The value of myvar changes from positive to negative with unary minus operator.
    Bit-wise negation(

    ) : This operator is used to negate every bit of the integer value i.e., turns 0 to 1 and 1 to 0.
    Example:

    In the above example, The value myvar is ‘0000…00’ in binary while the negation is ‘1111…11’ which is the 2’s complement value of -1.
    Exponent(**) operator : This operator is used to raise one quantity to the power of another.
    Example:

    Bitwise shift left / Bitwise shift right : This operator is used to shift the order of the bits either to the left or right.
    Example:

    Bitwise AND operator : This operator does a bitwise comparison between two bits and returns 1 if both are 1 else returns 0.
    Example:

    Bitwise OR operator : This operator does a bitwise comparison between two bits and returns 1 if atleast one the bits is 1, else returns 0.
    Example:

    Bitwise XOR operator : This operator does a bitwise comparison between two bits and returns 0 if they are alike, else returns 1.
    Example:

    Источник

    Глава 11. Внутренние команды

    Внутренняя команда — это команда, которая встроена непосредственно в Bash. Команды делаются встроенными либо из соображений производительности — встроенные команды исполняются быстрее, чем внешние, которые, как правило, запускаются в дочернем процессе, либо из-за необходимости прямого доступа к внутренним структурам командного интерпретатора.

    Действие, когда какая либо команда или сама командная оболочка инициирует ( порождает ) новый подпроцесс, что бы выполнить какую либо работу, называется ветвлением ( forking ) процесса. Новый процесс называется «дочерним» (или «потомком»), а породивший его процесс — «родительским» (или «предком»). В результате и потомок и предок продолжают исполняться одновременно — параллельно друг другу.

    В общем случае, встроенные команды Bash, при исполнении внутри сценария, не порождают новый подпроцесс, в то время как вызов внешних команд, как правило, приводит к созданию нового подпроцесса.

    Внутренние команды могут иметь внешние аналоги. Например, внутренняя команда Bash — echo имеет внешний аналог /bin/echo и их поведение практически идентично.

    Ключевое слово (keyword) — это зарезервированное слово, синтаксический элемент (token) или оператор. Ключевые слова имеют специальное назначение для командного интерпретатора, и фактически являются элементами синтаксиса языка командной оболочки. В качестве примера можно привести » for » , » while » , «do» , » ! » , которые являются ключевыми (или зарезервированными) словами. Подобно встроенным командам , ключевые слова жестко зашиты в Bash, но в отличие от встроенных команд, ключевые слова не являются командами как таковыми, хотя при этом могут являться их составной частью. [1]

    Ввод/вывод

    выводит (на stdout) выражение или содержимое переменной (см. Пример 4-1).

    Для вывода экранированных символов, echo требует наличие ключа -e. См. Пример 5-2.

    Обычно, командв echo выводит в конце символ перевода строки. Подавить вывод это символа можно ключом -n.

    Команда echo может использоваться для передачи информации по конвейеру другим командам.

    Кроме того, команда echo, в комбинации с подстановкой команд может учавствовать в операции присвоения значения переменной.

    a=`echo «HELLO» | tr A-Z a-z`

    Следует запомнить, что команда echo `command` удалит все символы перевода строки, которые будут выведены командой command.

    Переменная $IFS обычно содержит символ перевода строки \n , как один из вариантов пробельного символа. Bash разобьет вывод команды command, по пробельным символам, на аргументы и передаст их команде echo, которая выведет эти аргументы, разделенные пробелами.

    Это встроенная команда Bash и имеет внешний аналог /bin/echo.

    printf — команда форматированного вывода, расширенный вариант команды echo и ограниченный вариант библиотечной функции printf() в языке C, к тому же синтаксис их несколько отдичается друг от друга.

    Это встроенная команда Bash. Имеет внешний аналог /bin/printf или /usr/bin/printf. За более подробной информацией обращайтесь к страницам справочного руководства man 1 printf по системным командам.

    Старые версии Bash могут не поддерживать команду printf.

    Пример 11-1. printf в действии

    Одно из полезных применений команды printf — форматированный вывод сообщений об ошибках

    «Читает» значение переменной с устройства стандартного ввода — stdin, в интерактивном режиме это означает клавиатуру. Ключ -a позволяет записывать значения в массивы (см. Пример 25-3).

    Пример 11-2. Ввод значений переменных с помощью read

    Если команде read не была передано ни одной переменной, то ввод будет осуществлен в переменную $REPLY.

    Пример 11-3. Пример использования команды read без указания переменной для ввода

    Обычно, при вводе в окне терминала с помощью команды «read», символ \ служит для экранирования символа перевода строки. Ключ -r заставляет интерпретировать символ \ как обычный символ.

    Пример 11-4. Ввод многострочного текста с помощью read

    Команда read имеет ряд очень любопытных опций, которые позволяют выводить подсказку — приглашение ко вводу (prompt), и даже читать данные не дожидаясь нажатия на клавишу ENTER.

    Ключ -n, кроме всего прочего, позволяет команде read обнаруживать нажатие курсорных и некоторых других служебных клавиш.

    Пример 11-5. Обнаружение нажатия на курсорные клавиши

    Ключ -t позволяет ограничивать время ожидания ввода командой read (см. Пример 9-4).

    Команда read может считывать значения для переменных из файла, перенаправленного на stdin. Если файл содержит не одну строку, то переменной будет присвоена только первая строка. Если команде read будет передано несколько переменных, то первая строка файла будет разбита, по пробелам, на несколько подстрок, каждая из которых будет записана в свою переменную. Будьте осторожны!

    Пример 11-6. Чтение командой read из файла через перенаправление

    Передача информации, выводимой командой echo, по конвейеру команде read, будет вызывать ошибку.

    Тем не менее, передача данных по конвейеру от cat, кажется срабатывает.

    Файловая система

    Уже знакомая нам команда cd, изменяющая текущий каталог, может быть использована в случаях, когда некоторую команду необходимо запустить только находясь в определенном каталоге.

    Команда cd с ключом -P (physical) игнорирует символические ссылки.

    Команда » cd —» выполняет переход в каталог $OLDPWD — предыдущий рабочий каталог.

    Неожиданным образом выполняется команда cd, если ей передать, в качестве каталога назначения, два слэша.

    Само собой разумеется, это должен был бы быть каталог /. Эта проблема наблюдается как в командной строке, так и в сценариях.

    Выводит название текущего рабочего каталога (Print Working Directory) (см. Пример 11-7). Кроме того, имя текущего каталога хранится во внутренней переменной $PWD.

    Этот набор команд является составной частью механизма «закладок» на каталоги и позволяет перемещаться по каталогам вперед и назад в заданном порядке. Для хранения имен каталогов используется стек (LIFO — «последний вошел, первый вышел»).

    pushd dir-name — помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name.

    popd — выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека.

    dirs — выводит содержимое стека каталогов (сравните с переменной $DIRSTACK). В случае успеха, обе команды — pushd и popd автоматически вызывают dirs.

    Эти команды могут оказаться весьма полезными, когда в сценарии нужно производить частую смену каталогов, но при этом не хочется жестко «зашивать» имена каталогов. Обратите внимание: содержимое стека каталогов постоянно хранится в переменной-массиве — $DIRSTACK.

    Пример 11-7. Смена текущего каталога

    Переменные

    Команда let производит арифметические операции над переменными. В большинстве случаев, ее можно считать упрощенным вариантом команды expr.

    Пример 11-8. Команда let, арифметические операции.

    eval arg1 [arg2] . [argN]

    Транслирует список аргументов, из списка, в команды.

    Пример 11-9. Демонстрация команды eval

    Пример 11-10. Принудительное завершение сеанса

    Пример 11-11. Шифрование по алгоритму «rot13»

    Rory Winston представил следующий пример, как образец практического использования команды eval.

    Пример 11-12. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval

    Команда eval может быть небезопасна. Если существует приемлемая альтернатива, то желательно воздерживаться от использования eval. Так, eval $COMMANDS исполняет код, который записан в переменную COMMANDS, которая, в свою очередь, может содержать весьма неприятные сюрпризы, например rm -rf *. Использование команды eval, для исполнения кода неизвестного происхождения, крайне опасно.

    Команда set изменяет значения внутренних переменных сценария. Она может использоваться для переключения опций (ключей, флагов), определяющих поведение скрипта. Еще одно применение — сброс/установка позиционных параметров (аргументов), значения которых будут восприняты как результат работы команды ( set `command`).

    Пример 11-13. Установка значений аргументов с помощью команды set

    Вызов set без параметров просто выводит список инициализированных переменных окружения.

    Если команда set используется с ключом » —» , после которого следует переменная, то значение переменной переносится в позиционные параметры (аргументы). Если имя переменной отсутствует, то эта команда приводит к сбросу позиционных параметров.

    Пример 11-14. Изменение значений позиционных параметров (аргументов)

    Команда unset удаляет переменную, фактически — устанавливает ее значение в null . Обратите внимание: эта команда не может сбрасывать позиционные параметры (аргументы).

    Пример 11-15. «Сброс» переменной

    Команда export экспортирует переменную, делая ее доступной дочерним процессам. К сожалению, невозможно экспортировать переменную родительскому процессу. В качестве примера использования команды export можно привести сценарии инициализации системы, вызываемые в процессе загрузки, которые инициализируют и экспортируют переменные окружения, делая их доступными для пользовательских процессов.

    Пример 11-16. Передача переменных во вложенный сценарий awk, с помощью export

    Допускается объединение инициализации и экспорта переменной в одну инструкцию: export var1=xxx.

    Однако, как заметил Greg Keraunen, в некоторых ситуациях такая комбинация может давать иной результат, нежели раздельная инициализация и экспорт.

    Команды declare и typeset задают и/или накладывают ограничения на переменные.

    То же самое, что и declare -r, делает переменную доступной только для чтения, т.е. переменная становится подобна константе. При попытке изменить значение такой переменной выводится сообщение об ошибке. Эта команда может расцениваться как квалификатор типа const в языке C.

    Мощный инструмент, используемый для разбора аргументов, передаваемых сценарию из командной строки. Это встроенная команда Bash, но имеется и ее «внешний» аналог /usr/bin/getopt, а так же программистам, пишущим на C, хорошо знакома похожая библиотечная функция getopt. Она позволяет обрабатывать серии опций, объединенных в один аргумент [2] и дополнительные аргументы, передаваемые сценарию (например, scriptname -abc -e /usr/local).

    С командой getopts очень тесно взаимосвязаны скрытые переменные. $OPTIND — указатель на аргумент ( OPTion INDex) и $OPTARG ( OPTion ARGument) — дополнительный аргумент опции. Символ двоеточия, следующий за именем опции, указывает на то, что она имеет дополнительный аргумент.

    Обычно getopts упаковывается в цикл while, в каждом проходе цикла извлекается очередная опция и ее аргумент (если он имеется), обрабатывается, затем уменьшается на 1 скрытая переменная $OPTIND и выполняется переход к началу новой итерации.

    Опциям (ключам), передаваемым в сценарий из командной строки, должен предшествовать символ «минус» ( —) или «плюс» ( +). Этот префикс ( — или +) позволяет getopts отличать опции (ключи) от прочих аргументов. Фактически, getopts не будет обрабатывать аргументы, если им не предшествует символ — или +, выделение опций будет прекращено как только встретится первый аргумент.

    Типичная конструкция цикла while с getopts несколько отличается от стандартной из-за отсутствия квадратных скобок, проверяющих условие продолжения цикла.

    Пример getopts, заменившей устаревшую, и не такую мощную, внешнюю команду getopt.

    Пример 11-17. Прием опций/аргументов, передаваемых сценарию, с помощью getopts

    Управление сценарием

    Когда эта команда вызывается из командной строки, то это приводит к запуску указанного сценария. Внутри сценария, команда source file-name загружает файл file-name. Таким образом она очень напоминает директиву препроцессора языка C/C++ — «#include». Может найти применение в ситуациях, когда несколько сценариев пользуются одним файлом с данными или библиотекой функций.

    Пример 11-18. «Подключение» внешнего файла

    Файл data-file для Пример 11-18, представленного выше, должен находиться в том же каталоге.

    Сценарий может подключить даже самого себя, только этому едва ли можно найти какое либо практическое применение.

    Пример 11-19. Пример (бесполезный) сценария, который подключает себя самого.

    Безусловное завершение работы сценария. Команде exit можно передать целое число, которое будет возвращено вызывающему процессу как код завершения. Вообще, считается хорошей практикой завершать работу сценария, за исключением простейших случаев, командой exit 0, чтобы проинформировать родительский процесс об успешном завершении.

    Если сценарий завершается командой exit без аргументов, то в качестве кода завершения сценария принимается код завершения последней выполненной команды, не считая самой команды exit.

    Это встроенная команда интерпретатора shell, заменяет текущий процесс новым процессом, запускаемым командой exec. Обычно, когда командный интерпретатор встречает эту команду, то он порождает дочерний процесс, чтобы исполнить команду. При использовании встроенной команды exec, оболочка не порождает еще один процесс, а заменяет текущий процесс другим. Для сценария это означает его завершение сразу после исполнения команды exec. По этой причине, если вам встретится exec в сценарии, то, скорее всего это будет последняя команда в сценарии.

    Пример 11-20. Команда exec

    Пример 11-21. Сценарий, который запускает себя самого

    Команда exec так же может использоваться для перенаправления. Так, команда exec stdin) файлом zzz-file (см. Пример 16-1).

    Ключ -exec команды find — это не то же самое, что встроенная команда exec.

    Эта команда позволяет изменять ключи (опции) оболочки на лету (см. Пример 23-1 и Пример 23-2). Ее часто можно встретить в стартовых файлах, но может использоваться и в обычных сценариях. Требует Bash версии 2 или выше.

    Команды

    Команда возвращает код завершения — ноль , или успешное завершение, и ничего больше.

    Возвращает код завершения, свидетельствующий о неудаче, и ничего более.

    Очень похожа на внешнюю команду which, type cmd выводит полный путь к «cmd» . В отличие от which, type является внутренней командой Bash. С опцией -a не только различает ключевые слова и внутренние команды, но и определяет местоположение внешних команд с именами, идентичными внутренним.

    Запоминает путь к заданной команде (в хэш-таблице командной оболочки), благодаря чему, при повторном обращении к ней, оболочка или сценарий уже не будет искать путь к команде в $PATH. При вызове команды hash без аргументов, просто выводит содержимое хэш-таблицы. С ключом -r — очищает хэш-таблицу.

    help COMMAND — выводит краткую справку по использованию внутренней команды COMMAND. Аналог команды whatis, только для внутренних команд.

    11.1. Команды управления заданиями

    Некоторые из нижеследующих команд принимают, в качестве аргумента, «идентификатор задания» . См. таблицу в конце главы.

    Выводит список заданий, исполняющихся в фоне. Команда ps более информативна.

    Задания и процессы легко спутать. Некоторые внутренние команды, такие как kill, disown и wait принимают в качестве параметра либо номер задания, либо номер процесса. Команды fg, bg и jobs принимают только номер задания.

    «1» — это номер задания (управление заданиями осуществляет текущий командный интерпретатор), а «1384» — номер процесса (управление процессами осуществляется системой). Завершить задание/процесс («прихлопнуть») можно либо командой kill %1, либо kill 1384.

    Удаляет задание из таблицы активных заданий командной оболочки.

    Команда fg переводит задание из фона на передний план. Команда bg перезапускает приостановленное задание в фоновом режиме. Если эти команды были вызваны без указания номера задания, то они воздействуют на текущее исполняющееся задание.

    Останавливает работу сценария до тех пор пока не будут завершены все фоновые задания или пока не будет завершено задание/процесс с указанным номером задания/PID процесса. Возвращает код завершения указанного задания/процесса.

    Вы можете использовать команду wait для предотвращения преждевременного завершения сценария до того, как завершит работу фоновое задание.

    Пример 11-22. Ожидание завершения процесса перед тем как продолжить работу

    Команда wait может принимать необязательный параметр — номер задания/процесса, например, wait %1 или wait $PPID. См. таблицу идентификации заданий.

    При запуске команды в фоне из сценария может возникнуть ситуация, когда сценарий приостанавливает свою работу до тех пор, пока не будет нажата клавиша ENTER. Это, кажется, происходит с командами, делающими вывод на stdout. Такое поведение может вызывать раздражение у пользователя.

    Разместив команду wait, после запуска фонового задания, можно предотвратить такое поведение сценария.

    Перенаправление вывода в файл или даже на устройство /dev/null также снимает эту проблему.

    Действует аналогично нажатию на комбинацию клавиш Control+— Z, за исключением того, что она приостанавливает работу командной оболочки.

    Завершает сеанс работы командной оболочки, можно указать необязательный код завершения.

    Выдает статистику исполнения команд в единицах системного времени, в следующем виде:

    Имеет весьма ограниченную сферу применения, так как сценарии крайне редко подвергаются профилированию.

    Принудительное завершение процесса путем передачи ему соответствующего сигнала (см. Пример 13-4).

    Пример 11-23. Сценарий, завершающий себя сам с помощью команды kill

    Команда kill -l выведет список всех сигналов. Команда kill -9 — это «жесткий kill» , она используется, как правило, для завершения зависших процессов, которые упорно отказываются «умирать», отвергая простой kill. Иногда достаточно подать команду kill -15. «Процессы-зомби» , т.е. процессы, «родители» которых уже завершили работу, не могут быть «убиты» таким способом (невозможно «убить» «мертвого»), рано или поздно с ними «расправится» процесс init.

    Директива command COMMAND запрещает использование псевдонимов и функций с именем «COMMAND» .

    Это одна из трех директив командного интерпретатора, которая влияет на обработку команд. Другие две — builtin и enable.

    Конструкция builtin BUILTIN_COMMAND запускает внутреннюю команду «BUILTIN_COMMAND» , на время запрещая использование функций и внешних системных команд с тем же именем.

    Либо запрещает, либо разрешает вызов внутренних команд. Например, enable -n kill запрещает использование внутренней команды kill, в результате, когда интерпретатор встретит команду kill, то он вызовет внешнюю команду kill, т.е. /bin/kill.

    Команда enable -a выведет список всех внутренних команд, указывая для каждой — действительно ли она разрешена. Команда enable -f filename загрузит внутренние команды как разделяемую библиотеку (DLL) из указанного объектного файла. [3] .

    Перенесена в Bash из ksh . Если функция объявлена как autoload, то она будет загружена из внешнего файла в момент первого вызова. [4] Такой прием помогает экономить системные ресурсы.

    Обратите внимание: autoload не является частью ядра Bash. Ее необходимо загрузить с помощью команды enable -f (см. выше).

    Таблица 11-1. Идентификация заданий

    Нотация Описание
    %N Номер задания [N]
    %S Вызов (командная строка) задания, которая начинается со строки S
    %?S Вызов (командная строка) задания, которая содержит строку S
    %% «текущее» задание (последнее задание приостановленное на переднем плане или запущенное в фоне)
    %+ «текущее» задание (последнее задание приостановленное на переднем плане или запущенное в фоне)
    %- Последнее задание
    $! Последний фоновый процесс

    Примечания

    Исключение из правил — команда time, которая в официальной документации к Bash называется ключевым словом.

    Опция — это аргумент, который управляет поведением сценария и может быть либо включен, либо выключен. Аргумент, который объединяет в себе несколько опций (ключей), определяет поведение сценария в соответствии с отдельными опциями, объединенными в данном аргументе..

    Как правило, исходные тексты подобных библиотек, на языке C, располагаются в каталоге /usr/share/doc/bash-. /functions.

    Обратите внимание: ключ -f команды enable может отсутствовать в некоторых системах.

    Тот же эффект можно получить с помощью typeset -fu.

    Источник

    Читайте также:  Windows не может обнаружить устройства vpn
    Оцените статью