English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В отличие от языков, таких как Java, PHP и т.д., управление потоком в sh не может быть пустым, как (ниже приведен пример грамматики управления потоком PHP):
<?php if (isset($_GET["q"])) { search(q); } else { // Ничего не делать }
В sh/bash так писать нельзя, если у分支机构 else нет выполнения команд, не пишите этот else.
Формат грамматики 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 condition then command1 command2 ... commandN else command fi
Формат грамматики 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
Результат вывода:
Два числа равны!
Как и другие языки программирования, 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 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 выполняет серию команд до тех пор, пока условие не станет 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 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 позволяет跳出 все циклы (прекратить выполнение всех последующих циклов).
В следующем примере скрипт застрянет в的死 цикле до тех пор, пока пользователь не введет число больше 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 аналогична команде 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 "Конец игры"Никогда не будет выполнено.