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

Сценарии оболочки, часть 3: структуры управления принятием решений в сценариях оболочки


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

  1. Введение
  2. Если оператор
    1. Общий синтаксис

    1. Условие на основе файла
    2. Принятие решения на основе файлов
    3. Условие на основе строки
    4. Арифметическое условие

    Привет! Мы уже рассмотрели основы сценариев оболочки, такие как прием входных данных, обработка данных с помощью арифметических операций, а также создание и отображение вывода в предыдущих частях этого руководства (часть 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:


    case in
    <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

    Следующий урок: структуры управления повторением