Поиск по сайту:

Сценарии оболочки, часть 2: прием входных данных и выполнение арифметических действий оболочки


На этой странице

  1. Переменные в Linux
  2. Переменные среды
    1. Изменение значений переменных среды

    1. Правила именования переменных оболочки
    2. Присвоение значений переменным оболочки с помощью команды чтения:
    3. Выполнение простых арифметических действий с помощью оболочки

    Привет! Эта статья является второй частью серии руководств по написанию сценариев оболочки Howtoforge. К этому времени я предполагаю, что вы прочитали первую часть серии и знаете, как создать простой скрипт и выполнить его. Во второй части вы узнаете, как принимать входные данные от пользователя и обрабатывать их с помощью сценариев оболочки. Давайте начнем!

    Переменные в Linux

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

    Переменные среды

    Переменные среды являются переменными по умолчанию в Linux и используются для передачи информации между процессами в оболочке. Переменные среды чувствительны к регистру и всегда должны быть написаны с заглавной буквы для доступа к ним.

    В таблице ниже показаны общие переменные среды в оболочке Linux:

    Variable name Usage
    BASH Holds the full path of the command interpreter for Bash scripts
    BASH_VERSION Holds the bash release version of the machine currently used
    HOME Holds the relative path of the home directory.
    LOGNAME Holds the account name of the current user logged-in
    OSTYPE Holds a string that describes the current OS of the machine used
    PATH Holds a colon-separated absolute path of the executable files in Linux
    PWD Holds the current working directory of the shell
    SHELL Holds the preferred command line shell
    USER Works similar to LOGNAME. It holds the account name of the user currently logged-in
    _ Holds the name of the recently used command in the shell

    Чтобы отобразить значение переменной среды, пользователь должен добавить перед переменной знак доллара ($). Например, чтобы отобразить некоторую системную информацию, такую как текущий рабочий каталог, вошедший в систему пользователь и тип ОС, используя эхо, мы используем:

    #!/bin/bash
    echo $PWD
    echo $LOGNAME
    echo $OSTYPE

    Результат:

    Чтобы получить полный список переменных среды в Linux, используйте команду env.

    Изменение значений переменных окружения

    Для обеспечения гибкости системы можно управлять этими переменными среды. Чтобы установить значение переменной среды, используйте выражение присваивания (знак равенства).

    Пример:

    #!/bin/bash
    echo $USER
    USER="new user"
    echo $USER

    Результат скрипта:

    Когда вы запускаете скрипт, сначала $USER в строке echo $USER показывает значение переменной USER. С помощью оператора присваивания (=) переменная USER изменяет свое значение. Однако, если пользователь присвоит неизвестные значения переменной среды, оболочка создаст другую переменную оболочки, аналогичную переменной среды в локальном контексте скрипта, но это не повлияет на поведение других приложений. Это означает, что как только наш скрипт будет закрыт, переменная USER сохранит свое значение по умолчанию.

    Обратите внимание, что в нашем предыдущем примере мы опускаем знак доллара ($) в имени переменной при манипулировании значениями переменных среды, такими как строка USER=\новый пользователь\. Кроме того, при использовании оператора присваивания между USER и знаком=не должно быть пробела. Добавление пробела между ними приводит к ошибке.

    Переменные оболочки

    Оболочка также позволяет пользователю объявлять переменные. Как и в PHP, для объявления переменной в сценариях оболочки пользователю не нужно беспокоиться об объявлении ее типа данных; интерпретатор автоматически определит тип данных переменных на основе данных, которые пользователь сохраняет в нем во время выполнения.

    Правила именования переменных оболочки

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

    1. Имена переменных должны начинаться с буквы или символа подчеркивания.
    2. Он должен содержать только буквенно-цифровые символы или знак подчеркивания.
    3. Переменные чувствительны к регистру, поэтому переменные path, PATH и Path различаются.

    Чтобы доказать это правило, мы создадим простой скрипт ниже:

    #!/bin/bash
    12abc=10
    abc#*=10
    _abc=10
    _ABC=2
    echo $12abc $abc#* $_abc $_ABC

    Строки 2 и 3 возвращают ошибку «команда не найдена», поскольку переменная 12abc начинается с числового символа, а переменная abc#* содержит недопустимые символы. Мы также доказали, что _abc и _ABC — разные переменные, и строка _ABC=2 не переопределяет значение _abc.

    Присвоение значений переменным оболочки с помощью команды чтения:

    read — это команда, которая позволяет принимать входные данные от пользователя. Синтаксис использования команды чтения:

    read <variable_name>

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

    #!/bin/bash
    echo "Your first name: "
    read fname
    echo "Your last name:"
    read lname 
    echo "Hello $fname $lname ! I am learning how to create shell scripts."

    Результат:

    Обратите внимание, что, как и в предыдущем примере, нам не нужно объявлять переменную, чтобы использовать ее. Интерпретатор также автоматически создает переменную, которая используется в команде чтения. Однако в примере мы неоднократно использовали команду echo для создания подсказки пользователю. Команда чтения также имеет возможность создавать приглашение при принятии пользовательского ввода. Синтаксис использования приглашения в команде чтения:

    read -p "Your prompt: " <variable_name>

    Чтобы упростить наш предыдущий код, мы можем реконструировать код так:

    #!/bin/bash
    read -p "Your first name: " fname
    read -p "Your last name: " lname
    echo "Hello $fname $lname ! I am learning how to create shell scripts"

    Еще одним преимуществом команды чтения является то, что командная строка находится сразу после текста, а не в строке ниже.

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

    read -s -p "your prompt" <variable_name>

    Выполнение простых арифметических действий с помощью оболочки

    Помимо приема ввода и отображения вывода, оболочка bash также имеет встроенную арифметическую опцию. В таблице ниже приведены встроенные арифметические операторы оболочки Bash.

    Operator Description Syntax Usage
    + Addition a=$((b+c)) Adds the value of b and c and stores it to variable a
    - Subtraction a=$((b-c)) Subtracts the value of c from b and stores it to variable a
    * Multiplication a=$((b*c)) Multiplies the value of b and c and stores it to variable a
    / Division a=$((b/c)) Divides the value of b by c and stores it to the variable a
    % Modulus a=$((b%c)) Performs modulo division of b and c and stores it to variable a
    ++ Pre-increment $((++aa)) Increments the value of variable a immediately
    ++ Post-increment $((a++)) Increments the value of variable a and reflect changes to the next line
    -- Pre-decrement $((--a)) Decrements the value of variable a immediately
    -- Post-decrement $((a--)) Decrements the value of variable a and reflect changes to the next line
    ** Exponentiation $((a**2)) Raise the value of a to the exponent of 2
    += Plus equal $((a+=b)) Adds the value of a and b and stores it to the variable a
    -= Minus equal $((a-=b)) Subtracts the value of b from a and stores it to the variable a
    *= Times equal $((a*=b)) Multiplies the value of a and b and stores it to variable a
    /= Slash equal $((a/=b)) Divides the value of a by b and stores it to the variable a
    %= Mod-equal $((a%=b)) Perform modulo division between a and b and stores it to variable a

    Обратите внимание, что каждый раз, когда вы выполняете арифметическую инструкцию, все наши переменные будут заключены в знак доллара и двойные круглые скобки. Делая это, интерпретатор обрабатывает значения наших переменных как целые числа. Без него интерпретатор обрабатывает значения переменной как строку. Чтобы получить пример, см. скрипт ниже:

    #!/bin/bash
    read -p "Enter int1: " a
    read -p "Enter int2: " b
    echo $((a+b))
    c=$a+$b
    echo $c

    Когда мы запускаем наш пример, строка $ ((a+b)) добавляет пользовательские значения, которые хранятся в переменных a и b соответственно, в то время как c=$a+$b обрабатывает переменные a и b как строку.

    Заключение

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

    Использованная литература:

    Информационный проект Linux. (2007). Получено 29 апреля 2015 г. с Linfo.org: http://www.linfo.org/

    Купер, М. (nd). Расширенное руководство по написанию сценариев Bash. Получено 29 апреля 2015 г. с сайта http://www.tldp.org/LDP/abs/html/.

    Переменные среды. (н.д.). Получено 29 апреля 2015 г. из документации Ubuntu: https://help.ubuntu.com/community/EnvironmentVariables.