English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Контроль потоков Shell

Контроль потоков Shell

В отличие от языков, таких как Java, PHP и т.д., управление потоком в sh не может быть пустым, как (ниже приведен пример грамматики управления потоком PHP):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // Ничего не делать
}

В sh/bash так писать нельзя, если у分支机构 else нет выполнения команд, не пишите этот else.

if else

fi

Формат грамматики if:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

Написать в одну строку (подходит для командной строки):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

Конец fi - это просто обратное написание if, с которым вы还将 встретиться.

if else

Формат грамматики if else:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

Формат грамматики if else-if else:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

Ниже приведен пример того, как можно определить, равны ли два переменные:

a=10
b=20
if [$a == $b]
then
   echo 'a равно b'
elif [$a -gt $b]
then
   echo 'a больше b'
elif [$a -lt $b]
then
   echo 'a меньше b'
else
   echo 'Нет соответствующих условий'
fi

Результат вывода:

a меньше b

Если использовать команду if else вместе с командой test, то это будет выглядеть так:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo 'Два числа равны!'
else
    echo 'Два числа не равны!'
fi

Результат вывода:

Два числа равны!

Цикл for

Как и другие языки программирования, Shell поддерживает цикл for.

Общий формат цикла for:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

Написать в одну строку:

for var in item1 item2 ... itemN; do command1; command2… done;

Когда значение переменной находится в списке, цикл for выполняет все команды один раз, используя имя переменной для получения текущего значения из списка. Команды могут быть любымиvalidными командами и выражениями shell. Список in может содержать заменители, строки и имена файлов.

Список in является опциональным, если его не использовать, цикл for использует позиционные аргументы командной строки.

Например, последовательный вывод чисел из текущего списка:

for loop in 1 2 3 4 5
do
    echo "Значение: $loop"
done

Результат вывода:

Значение: 1
Значение: 2
Значение: 3
Значение: 4
Значение: 5

Следовательно, выводится символ по символу из строки:

#!/bin/bash
for str in This is a string
do
    echo $str
done

Результат вывода:

This
is
a
string

Условие while

Цикл while используется для непрерывного выполнения серии команд и также для чтения данных из вводного файла. Его грамматический формат:

while condition
do
    command
done

Вот базовый цикл while, тестовым условием является: если int меньше или равно 5, то условие возвращает true. int начинается с 1, и в каждом цикле int увеличивается на 1. Запустите этот скрипт, и он вернет числа от 1 до 5, после чего завершится.

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Запустите скрипт, и вывод будет:

0
1
3
2
4

В предыдущих примерах использовалась команда Bash let, которая используется для выполнения одного или нескольких выражений, при вычислении переменных не нужно добавлять $ перед ними, подробности можно найти здесь:Команда Bash let

.

Цикл while может использоваться для чтения информации с клавиатуры. В следующем примере вводимая информация устанавливается как переменная FILM, цикл завершается нажатием <Ctrl-D>.

echo 'Нажмите <CTRL-D>, чтобы выйти'
echo -n 'Введите имя вашего любимого веб-сайта: '
while read FILM
do
    echo "Да! $FILM — это отличная веб-сайт"
done

Запустите скрипт, и вывод будет类似 к следующему:

Нажмите <CTRL-D>, чтобы выйти
Введите имя вашего любимого веб-сайта: Basis Tutorial Netz
Да! Basis Tutorial Netz — это отличная веб-сайт

Бесконечный цикл

Формат грамматики бесконечного цикла:

while :
do
    command
done

или

while true
do
    command
done

или

for (( ; ; ))

Цикл until

Цикл until выполняет серию команд до тех пор, пока условие не станет true, после чего цикл останавливается.

Цикл until и цикл while в подходе к обработке полностью противоположны.

Обычно цикл while превосходит цикл until, но в некоторых случаях — это всего лишь в редких случаях, цикл until более полезен.

Формат грамматики until:

until condition
do
    command
done

condition обычно является условным выражением, если возвращаемое значение равно false, то продолжается выполнение команд в теле цикла, в противном случае跳出 цикл.

В следующем примере мы используем команду until для вывода чисел от 0 до 9:

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Результат выполнения:

Результат вывода:

0
0
1
3
2
4
5
6
7
8

case ... esac

case ... esac 9

С помощью оператора case можно сопоставить значение с шаблоном, и если сопоставление успешное, выполнить соответствующие команды. Это много选择题,как в других языках с операторами switch ... case, это многоветвная структура выбора, каждый раздел начинается с правой круглой скобки, а заканчивается на двух точках с запятой ;;, что означает break, т.е. завершение выполнения и выход из всего оператора case ... esac, esac (является обратным case) в качестве знака завершения.

case ... esac Грамматический формат:

case "значение" in
Шаблон 1)
    command1
    command2
    ...
    commandN
    ;;
Шаблон 2)
    command1
    command2
    ...
    commandN
    ;;
esac

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

Значение будет проверяться на соответствие каждому шаблону. Как только шаблон соответствует, выполнение соответствующих команд шаблона завершается, и продолжается выполнение других шаблонов. Если ни один шаблон не соответствует, используется астериск * для захвата значения, и выполняются后面的 команды.

Ниже приведен скрипт, который предлагает ввести 1 до 4 и соответствует каждому режиму:

echo 'Введите номер от 1 до 4: '
echo 'Введенный вами номер: '
read aNum
case $aNum in
    1) echo 'Вы选择了 1'
    ;;
    2) echo 'Вы选择了 2'
    ;;
    3) echo 'Вы选择了 3'
    ;;
    4) echo 'Вы选择了 4'
    ;;
    * ) echo 'Вы не ввели номер от 1 до 4'
    ;;
esac

Разные вводы приводят к разным результатам, например:

Введите номер от 1 до 4:
Введенный вами номер:
3
Вы选择了 3

Ниже приведен скрипт, который соответствует строкам:

#!/bin/sh
site="w3codebox"
case "$site" in
   "w3codebox") echo "Базовый учебный сайт" 
   ;;
   "google") echo "Google поисковая система" 
   ;;
   "taobao") echo "淘宝网" 
   ;;
esac

Результат вывода:

Базовый учебный сайт

Выйти из цикла

В процессе цикла иногда необходимо принудительно跳出 цикл до достижения условия завершения цикла, Shell использует две команды для реализации этой функции: break и continue.

Команда break

Команда break позволяет跳出 все циклы (прекратить выполнение всех последующих циклов).

В следующем примере скрипт застрянет в的死 цикле до тех пор, пока пользователь не введет число больше 5. Чтобы выйти из этого цикла и вернуться к приглашению shell, нужно использовать команду break.

#!/bin/bash
while :
do
    echo -n "Введите число от 1 до 5:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Введенное вами число равно $aNum!"
        ;;
        * echo "Введенное вами число не находится в диапазоне от 1 до 5! Конец игры"
            break
        ;;
    esac
done

Запустите вышеуказанный код, результат выполнения будет:

Введите число от 1 до 5:3
Введенное вами число равно 3!
Введите число от 1 до 5:7
Введенное вами число не находится в диапазоне от 1 до 5! Конец игры

continue

Команда continue аналогична команде break, но с одной разницей: она не выйдет из всех циклов, а только из текущего.

Измените следующий пример:

#!/bin/bash
while :
do
    echo -n "Введите число от 1 до 5: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "Введенное вами число равно $aNum!"
        ;;
        * echo "Введенное вами число не находится в диапазоне от 1 до 5!"
            continue
            echo "Конец игры"
        ;;
    esac
done

Запустите код и обнаружите, что при вводе числа больше 5, цикл в этом примере не закончится, командаecho "Конец игры"Никогда не будет выполнено.