If-условные переходы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
В файле iftst с помощью if-запроса мы проверяем, были ли переданы два параметра. Если этого не произошло, выводится сообщение об ошибке. Программа завершается командой exit с возвращаемым значением, неравным нулю (индикатор ошибок). В противном случае содержимое обоих параметров выводится на экран. Критерием для условного перехода является возвращаемое значение последней команды перед then. Если эта команда возвращает значение 0, то условие выполняется. Если then указывается в той же строке, что и предыдущая команда (без перехода на следующую), то команда должна завершаться точкой с запятой. Условие может быть создано с помощью команды test оболочки bash. При этом оператор -ne означает «не равно» (not equal). Команда test применяется всякий раз, когда необходимо сравнить друг с другом две последовательности символов или два числа, когда необходимо проверить, существует ли файл, и т. д. Вместо test может использоваться краткий вариант в квадратных скобках. При этом перед названием команды [ и после него ] нужно ставить пробел. Кроме того, из структуры if можно вычленить вторую команду echo, так как из-за наличия команд exit все строки кода, следующие за fi, будут выполняться только после того, как будет реализовано условие. |
ВНИМАНИЕ:
1 2 3 4 5 |
Обратите внимание, что значение истинности (true) в bash равно 0, а ложности (false) — не равно 0. В большинстве других языков программирования значения прямо противоположны! Команды, завершаемые без ошибок, возвращают значение 0. Любое значение, не равное 0, указывает на ошибку. Некоторые команды возвращают различные значения в зависимости от типа ошибки. |
Основы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
If-предложения в Bash очень похожи на аналогичные в других языках. Они следуют базовой форме: if [[ "$some_variable" == "good input" ]]; then echo "You got the right input." elif [[ "$some_variable" == "ok input" ]]; then echo "Close enough" else echo "No way Jose." fi Дополнительный синтаксис в виде слова then, а также слегка странное закрывающее ключевое слово fi придает предложению немного экзотический вид, но в основе все то же самое, что и в других языках: Если (if) что-то является истиной, тогда (then) выполни вот это. В противном случае проверяй другие условия по порядку и делай то же самое. Если ни одно из условий не сработало, выполни последнее указание. Вы можете отбросить одну или все ветки elif, а также ветку else, если в них нет нужды! |
Булевы операторы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Могут использоваться для комбинирования выражений, как и в других языках ! - нет/не && - и || - или -lt - меньше, применяется в квадратных скобках [] -gt - больше, применяется в квадратных скобках [] [[ Двойные квадратные скобки ]] работают в целом так же, как и [одинарные квадратные скобки], но имеют дополнительные возможности вроде лучшей поддержки регулярных выражений. (( Двойные круглые скобки )) это конструкция, позволяющая осуществлять арифметические вычисления внутри Bash. Пример: if [[ "$name" == "Ryan" ]] && ! [[ "$time" -lt 2000 ]]; then echo "Sleeping" elif [[ "$day" == "New Year's Eve" ]] || [[ "$coffee_intake" -gt 9000 ]]; then echo "Maybe awake" else echo "Probably sleeping" fi |
Cкобки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Порой вам встретятся двойные квадратные скобки, как в примере выше. А порой они будут одинарными: if [ "$age" -gt 30 ]; then echo "What an oldy." fi Иногда могут быть и круглыми: !!! обрати внимание на age, это переменная и оформлена без ${age} if (( age > 30 )); then echo "Hey, 30 is the new 20, right?" fi А может и не быть: if is_upper "$1"; then echo "Stop shouting at me." fi Что происходит на самом деле: if ANY_COMMAND_YOU_WANT_AT_ALL; then # ... stuff to do fi |
Пример 0, скрипт iftst_v0:
1 2 3 4 5 6 7 8 |
#! /bin/sh # Пример iftst_v0 if test $# -ne 2; then echo "Команде должно быть передано ровно два параметра!" exit 1 else echo "Параметр 1: $1. Параметр 2: $2" fi |
Пример 0, скрипта iftst_v1:
1 2 3 4 5 6 7 |
#! /bin/sh # Пример iftst_v1 if [ $# -ne 2 ]; then echo " Команде должно быть передано ровно два параметра!" exit 1 fi echo "Параметр 1: $1, Параметр 2: $2" |
Пример 1:
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash a="`ls -al | wc -l`" echo ${a} if (( a > 2 )); then true echo "a > 2" else false echo "a<2" fi |
Пример 2:
1 2 |
#!!! выполняем команду ls если выведет больше 2 то выполнится команда ls /etc/ if (( `ls /home/ | wc -l` > 2)); then true ; else false ; fi && ls /etc/ |
Пример 3:
1 2 3 4 5 6 7 |
#!!! Удаляем из каталога (/temp/33) каталог, если вывод ls (/temp/33) больше 1 if (( `ls /temp/33 | wc -l` > 1)); then /usr/bin/find /tmp/33 -mindepth 1 -maxdepth 1 -type d | sort -n | head -n1 | while read LINE; do echo "[/tmp/33] ${LINE}" rm -rf "${LINE}" done fi |
Пример 4:
1 2 3 4 5 6 7 |
#!!! определение свободного места #!/bin/bash freespace=`df -m | grep "/dev/sdb" | awk '{print $4}'` if [ $freespace -le 700 ] then echo "Warning!!! On the Server running out of space on your hard drive. Freespace - "$freespace"Mb" | mail -s "FreeSpase on the Server" root@domain.com fi |
Пример 5:
1 2 3 4 5 6 7 8 9 10 |
#!!! Проверка маршрута для openvpn #!/bin/bash # Script for cron, check if route to VPN server exists route=`ip r | grep "85.143.252.68"` if [ -z "$route" ]; then systemctl restart openvpn-client@MskLabSokolov.service logger "Route doesn't exist, restart OpenVPN client" fi |
Пример 6:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash list_net_ip="192.168.55 192.168.80 192.168.88 10.12.88" ip_router="192.168.16.55" i=99 for x in ${list_net_ip} ; do i=$(ip route | grep "${x}" 1>/dev/null ; echo $?) if ((i > 0)) ; then #echo -e "ip route add ${x} via ${ip_router}" ip route add ${x}.0/24 via ${ip_router} fi done |