Сценарии оболочки, часть 3: структуры управления принятием решений в сценариях оболочки
На этой странице
- Введение
- Если оператор
- Общий синтаксис
- Условие на основе файла
- Принятие решения на основе файлов
- Условие на основе строки
- Арифметическое условие
Привет! Мы уже рассмотрели основы сценариев оболочки, такие как прием входных данных, обработка данных с помощью арифметических операций, а также создание и отображение вывода в предыдущих частях этого руководства (часть 2). В этой части мы углубимся в более сложную тему языка программирования — принятие решений в программе, но на этот раз мы сделаем это с помощью оболочки bash. Давайте начнем!
Вступление
Большинство современных языков программирования способны принимать решения на основе заданных нами условий. Условие — это выражение, результатом которого является логическое значение — истинное или ложное. Любой программист может сделать свою программу умной, основываясь на решениях и логике, которые он вкладывает в свою программу. Оболочка bash поддерживает операторы принятия решений if и switch (case).
Если заявление
If — это оператор, который позволяет программисту принять решение в программе на основе заданных им условий. Если условие выполнено, программа выполнит определенные строки кода, в противном случае программа выполнит другие задачи, указанные программистом. Ниже приведен поддерживаемый синтаксис оператора if в оболочке bash.
Общий синтаксис
Одно решение:
if <condition>
then
### series of code goes here
fiДвойное решение:
if <condition>
then
### series of code if the condition is satisfied
else
### series of code if the condition is not satisfied
fiМножественное если условие:
if <condition1>
then
### series of code for condition1
elif <condition2>
then
### series of code for condition2
else
### series of code if the condition is not satisfied
fiСинтаксис с одной скобкой
if [ condition ]
then
### series of code goes here
fiСинтаксис двойной скобки
if ((condition))
then
### series of code goes here
fiСинтаксис с одной скобкой является старейшим поддерживаемым синтаксисом в оболочке bash. Он используется вместе со всеми условными операторами в Linux. Между тем, синтаксис с двойными скобками используется для числового условного оператора, чтобы предоставить программистам знакомый синтаксис. Все типы операторов if требуют определенного условия для выполнения задачи.
Условные операторы в Linux
Условные операторы используются вместе с оператором управления принятием решений. Существуют различные типы условных операторов, которые вы можете использовать в оболочке bash. Наиболее распространенные из них: условия на основе файлов, строки и арифметические операции.
Файловое условие
Файловые условия представляют собой унарные выражения и часто используются для проверки состояния файла. В следующем списке показаны наиболее часто используемые файловые условия в оболочке bash.
Operator Description -a file Returns true if file exists -b file Returns true if file exists and is a block special file -c file Returns true if file exists and is a character special file -d file Returns true if file exists and is a directory -e file Returns true if file exists -r file Returns true if file exists and is readable -s file Returns true if file exists and has a greater size that zero -s file Returns true if file exists and has a greater size that zero -w file Returns true if file exists and is writable -x file Returns true if file exists and is executable -N file Returns true if the file exists and has been modified since it was last read Принятие решения на основе файла
Давайте рассмотрим пример, который продемонстрирует, как построить решение на основе файла в сценарии bash. В этом примере мы создадим скрипт, который определяет, существует ли файл в домашнем каталоге.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "file exists!"
else
echo "file does not exist"
fiВ этом примере мы гарантировали, что оболочка вернется в домашний каталог независимо от нашего текущего активного каталога с помощью команды cd. Кроме того, команда ls используется для отображения списка файлов в каталоге, чтобы мы могли убедиться, что файл действительно существует или нет. Как видите, скрипт выводит текст \файл существует!\, поскольку файл sample.sh находится в домашнем каталоге.
Note: The shell compiler is very strict in terms of syntax especially with spaces. There should be a space between if and the open bracket and in between brackets and the condition.
Теперь давайте улучшим наш скрипт, сделав наш код более динамичным, позволив пользователю вводить имя скрипта и определять права доступа к данному файлу.
#!/bin/bash
cd
ls -l
read -p "Enter a file name: " filename
if [ -e $filename ]
then
echo "file exists!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fiСтроковое условие
Принятие решений на основе строки, введенной пользователем, также возможно в оболочке bash. Строковое условие возвращает двоичное выражение в качестве результата, что означает, что оно возвращает true, если указанное условие выполняется, в противном случае оно возвращает false. Ниже приведены часто используемые строковые условные операторы:
Operator Description == Returns true if the strings are equal != Returns true if the strings are not equal -n Returns true if the string to be tested is not null -z Returns true if the string to be tested is null Давайте создадим пример скрипта, используя условный оператор на основе строк. Сценарий позволит пользователю ввести две строки и оценить, является ли одна из строк нулевой, обе строки равны и не равны.
#!/bin/bash
read -p "First String: " str1
read -p "Second String: " str2
if [ -z "$str1" ]
then
echo "The 1st string is null"
elif [ -z "$str2" ]
then
echo "The 2nd string is null"
else
if [ $str1 == $str2 ]
then
echo "The strings are equal"
else
echo "The strings are not equal"
fi
fiАрифметическое условие
Оболочка предоставляет несколько способов объявления арифметического условия. Во-первых, используется мнемоника, которую можно использовать вместе со старым синтаксисом с одинарной скобкой, а во-вторых, используются математические символы, которые можно использовать вместе с двойной скобкой.
Ниже приведен список доступных мнемоник для арифметических условных операторов в оболочке:
Operator Usage/Description -eq Equal -ge Greater Than or Equal -gt Greater Than -le Less Than or Equal -lt Less Than -ne Not Equal Давайте создадим скрипт, который принимает целое число от пользователя и определяет, является ли целое число нулем, отрицательным, нечетным или четным числом.
#!/bin/bash
read -p "Enter an integer: " int1
if [ $int1 -eq 0 ]
then
echo "Zero"
elif [ $int1 -lt 0 ]
then
echo "Negative"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Even"
else
echo "Odd"
fi
fiАрифметический оператор для синтаксиса с двойными скобками:
Operator Usage/Description == Equal >= Greater Than or Equal > Greater Than <= Less Than or Equal < Less Than != Not Equal Теперь давайте реконструируем наш предыдущий скрипт и используем синтаксис с двойными скобками:
#!/bin/bash
read -p "Enter an integer: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fiЗаявление о переключении
Оператор switch — это еще один тип условного оператора в сценариях оболочки. Это позволяет программисту сравнивать несколько значений с переменной более простым способом по сравнению с условным оператором if. Синтаксис оператора switch:
casein
<pattern1>)
##series of code for pattern1
;;
<pattern2>)
##series of code for pattern2
;;
<patternN>)
##series of code for patternN
;;
*)
##default statements
esac
Образец — это возможное значение переменной. Каждый шаблон отделяется двойной точкой с запятой, которая служит оператором разрыва шаблона. Оператор switch закрывается оператором esac.
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================"
printf "Menu: \n[a] Addition\n[b]Subtraction\n[c]Multiplication\n[d]Division\n"
echo "======================"
read -p "Your choice: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Invalid input"
esac
echo "The result is: " $resЗаключение
Оболочка bash предоставляет множество полезных инструментов для программистов. Как и большинство современных языков программирования, он также способен принимать условные решения, что делает сценарии оболочки более интерактивными и умными. Мы представим повторяющуюся структуру управления в следующей серии. До следующего раза.
использованная литература
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
Следующий урок: структуры управления повторением