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

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


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

  1. Введение
  2. Для циклов
    1. Синтаксис 1: структура For-in
    2. Синтаксис 2. Для циклического оператора со строковыми значениями списка
    3. Синтаксис 3: Оператор цикла for со списком в виде файла
    4. Синтаксис 4: C-подобный синтаксис

    1. Синтаксис 1. Структура While с условными операторами на основе арифметических символов
    2. Синтаксис 2. Оператор цикла While с условным оператором на основе мнемоники
    3. Синтаксис 3. Зацикливание инструкции с условным оператором на основе файла

    1. Синтаксис 1: цикл until с арифметическим условным оператором на основе символов
    2. Синтаксис 2: Оператор цикла until с условным оператором на основе мнемоники

    Добро пожаловать в четвертую часть серии руководств по написанию сценариев оболочки HowtoForges (нажмите здесь, чтобы прочитать часть 3 руководства). В этой части мы рассмотрим различные структуры управления повторением оболочки bash и способы использования каждой структуры, предоставив несколько примеров. Давайте начнем. -0;var ffid=1;var alS=1002%1000;var container=document.getElementById(slotId);container.style.width=100%;var ins=document.createElement(ins);ins.id=slotId+- asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive=true;}

    Вступление

    Структура управления повторением, также известная как структура управления циклом, представляет собой тип структуры управления в языках программирования, который используется для упрощения повторяющихся или рекурсивных задач. Операторы цикла оптимизируют любой код, предоставляя способ минимизировать код, упрощая устранение неполадок, чем неструктурированный код, обеспечивающий тот же результат. Существует три типа операторов цикла, поддерживаемых оболочкой bash: циклы for, while и until.

    Для циклов

    Цикл for — это оператор цикла, который использует ключевое слово for для объявления повторяющегося оператора. Bash поддерживает другой синтаксис оператора цикла for:

    Синтаксис 1: структура For-in

    for <varName> in <list>
    do
        #### your statement here
    done

    Этот синтаксис начинается с ключевого слова for, за которым следует имя переменной, ключевое слово in и список возможных значений переменной. Каждое значение в списке будет разделено пробелом, а начало строк кода, которые будут повторяться, определяется в do и заканчивается ключевым словом done.

    Давайте создадим простой оператор цикла, который позволит пользователю ввести 5 значений и получить сумму чисел:

    #!/bin/bash 
    result=0;
    input=0;
    for var in 1 2 3 4 5
    do
         printf "Input integer %d : " $var
         read input
         result=$((result+input))
    done
    echo "the result is " $result

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

    Синтаксис 2: Оператор цикла со значениями списка String

    Вы также можете объявить переменную, которая будет содержать список элементов для вашего счетчика. Например, рассмотрим следующий код:

    #!/bin/bash
    list="var1 var2 var3 var4"
    var=""
    mkdir sample
    cd sample
    echo creating the "directories...."
    for var in $list
    do
         mkdir $var
    done

    Строка list=\var1 var2 var3 var4\ определяет значения переменной списка. Затем он был назначен var в строке для var в $list, и, наконец, каталоги создаются в строке mkdir $var.

    Синтаксис 3: Оператор цикла for со списком в виде файла

    Вы также можете получить список из существующего файла, который будет использоваться в операторе цикла for вместо объявления его внутри вашего кода с помощью команды cat. Например, откройте свой любимый текстовый редактор, а затем перечислите как минимум пять имен каталогов.

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

    #!/bin/bash 
    dirList=$(cat list)
    echo "creating directories...."
    for var in $dirList
    do
    mkdir $var
    done

    Этот пример пригодится, когда вам нужно создать сотни каталогов на вашем компьютере с Linux, не так ли?

    Синтаксис 4: C-подобный синтаксис

    for((initialization; boolean_test; increment/decrement))
    do
    #### your code goes here
    done

    Возможно, самая знакомая структура цикла for, поддерживаемая оболочкой, — это C-подобная структура. Цикл начинается с инициализации переменной счетчика, а затем оболочка оценивает логическое выражение, объявленное после инициализации. Если результат логического выражения истинен, то оболочка выполнит набор операторов внутри предложения do, в противном случае он завершает оператор цикла и переходит к строке после ключевого слова done. Оболочка перейдет к следующей итерации с помощью оператора увеличения или уменьшения, объявленного после логического теста. В качестве примера давайте реконструируем наш первый пример, используя эту структуру.

    #!/bin/bash 
    result=0
    input=0
    for((var=1;var<=5;var++))
    do
    printf "Input integer %d : " $var
    read input
    result=$((result+input))
    done
    echo $result

    Заявление о цикле

    Оператор while — это тип повторяющейся структуры в bash, в которой используется ключевое слово while. В отличие от синтаксиса C-типа структуры цикла for, повторяющаяся структура управления while разделяет инициализацию, логическую проверку и оператор увеличения/уменьшения.

    Синтаксис 1: структура While с условными операторами на основе арифметических символов

    <initialization>
    while(condition)
    do
        ###your code goes here
    <increment/decrement>
    done

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

    #!/bin/bash
    result=0
    input=0
    var=1
    while((var <= 5))
    do
    printf "Input integer %d : " $var
    read input
    result=$((result+input))
    var=$((var+1))
    done
    echo "the result is " $result

    Глядя на наш пример, оператор while начинается с инициализации нашей переменной-счетчика var. Затем после ключевого слова while объявляется логический тест, а внутри операторов do и done будет объявлен набор повторяемых операторов. В операторах while интерпретатор будет запускать и выполнять повторение кодов только в том случае, если результат логического теста истинен. С другой стороны, оператор цикла будет завершать итерацию кодов только тогда, когда логическое выражение приводит к ложному результату.

    Синтаксис 2: Оператор цикла While с условным оператором на основе мнемоники

    <initialization>
    while [ <condition> ]
    do
    ####your code goes here
    <increment/decrement>
    done

    Вы также можете объявить условный оператор на основе мнемоники внутри оператора цикла while. Для объявления вместо круглой скобки будет использоваться квадратная скобка. (Посмотрите условные операторы на основе мнемоники здесь) Например:

    #!/bin/bash 
    var=1;
    while [ $var -le 5 ]
    do
    printf "Input integer %d : " $var
    read input
    result=$((result+input))
    var=$((var+1))
    done
    echo "the result is " $result

    Синтаксис 3: Оператор цикла While с условным оператором на основе файла

    while read <variable_name>
    do
    ####your code goes here
    done <<path to the text file>

    Как и в операторе цикла for, вы также можете открыть текстовый файл и связать его с оператором цикла while. Например:

    #!/bin/bash 
    mkdir sample2
    cd sample2
    echo "creating directories..."
    while read var
    do
        mkdir $var
    done<list

    В этом примере я переработал список, который мы создали некоторое время назад, и создал новый скрипт в том же каталоге. Обратите внимание, что если ваш текстовый файл находится в другом каталоге, вы должны указать точный путь к файлу после символа <.

    Оператор до цикла

    Другой тип оператора цикла, который поддерживает bash, — это структура until. Оператор until выполняет каждую команду внутри цикла до тех пор, пока объявленное логическое выражение не станет ложным. Это полная противоположность инструкции while.

    Синтаксис 1: До цикла с арифметическим условным оператором на основе символов

    until ((<conditional_statement>))
    do
    ####set of commands
    done

    Давайте рассмотрим пример:

    result=0 
    input=0
    var=1
    until((var > 5))
    do
    printf "Input integer %d : " $var
    read input
    result=$((result+input))
    var=$((var+1))
    done
    echo "the result is " $result

    Синтаксис 2: Оператор до цикла с условным оператором на основе мнемоники

    <initialization>
    until [ <condition> ]
    do
         ####your code goes here
    <increment/decrement>
    done

    Так как оператор until является противоположностью оператора цикла while, вы также можете объявить условный оператор на основе мнемоники в структуре until. Однако для того, чтобы завершить, вы должны объявить противоположное условное выражение, то есть заставить условное выражение оцениваться как ложное.

    !/bin/bash 
    result=0
    input=0
    var=1
    until [ $var -gt 5 ]
    do
    printf "Input integer %d : " $var
    read input
    result=$((result+input))
    var=$((var+1))
    done
    echo "the result is " $result

    Заключение

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