Операционная система Free BSD

         

Управление ходом выполнения. Циклы


Управлять ходом выполнения сценария на языке bash можно, используя кострукцию операторов if-fi. Оператор if имеет вид: if <условие 1>; then <список операторов 1> elif <условие 2>; then <список операторов 2> else <список операторов 3> fi

Работает эта конструкция так:

Если выполнено <условие 1>, то выполняется <список операторов 1>.

Если невыполнено <условие 1>, но выполнено <условие 2>, то выполняется <список операторов 2>.

Если невыполнено <условие 1> и невыполнено <условие 2>, то выполняется <список операторов 3>.

В конструкции if-fi операторы elif и else являются необязательными.

В качестве условия проверки может быть использована любая команда (или список команд). Тогда условие будет считаться выполненным, если команда (список команд) завершилась с кодом 0 (т.е. выполнилась нормально). Но на практике чаще используют команду test для проверки какого-либо выражения. Команда test записывается так:

test <выражение> или же [<выражение>]. Ниже приводится список опций, используемых при выполнении команды test.

  • -d file Истинно, если файл file существует и является директорией.
  • -e file Истинно, если файл file существует.
  • -f file Истинно, если файл file существует и является обычным файлом.
  • -k file Истинно, если файл file существует и для него установлен sticky-бит.
  • -L file Истинно, если файл file существует и является символической ссылкой.
  • -r file Истинно, если файл file существует и его можно читать.
  • -s file Истинно, если файл file существует и имеет ненулевой размер.
  • -t file Истинно, если файл file открыт на терминале.
  • -w file Истинно, если файл file существует и в него можно записывать.
  • -x file Истинно, если файл file существует и является выполняемым.
  • -O file Истинно, если файл file существует и принадлежит текущему пользователю.
  • file1 -nt file2 Истинно, если файл file1 создан (изменен) позднее, чем файл file2.
  • file1 -ot file2 Истинно, если файл file1 создан (изменен) раньше, чем файл file2.
  • -z <строка> Истинно, если длина строки <строка> равна нулю.
  • -n string Истинно, если длина строки <строка> не равна нулю.
  • string1 = string2 Истинно, если строки равны.
  • string1 != string2 Истинно, если строки не равны.
  • ! <выражение> Истинно, если выражение ложно.
  • <выражение1> -a <выражение2> Истинно, если оба выражения истинны.
  • <выражение1> -o <выражение2> Истинно, если хотя бы одно из выражений истинно.
  • <число1> -eq <число2> Истинно, если число <число1> равно числу <число2>.
  • <число1> -ne <число2> Истинно, если число <число1> не равно числу <число2>.
  • <число1> -lt <число2> Истинно, если число <число1> меньше числа <число2>.
  • <число1> -le <число2> Истинно, если число <число1> меньше или равно числа <число2>.
  • <число1> -gt <число2> Истинно, если число <число1> больше числа <число2>.
  • <число1> -ge <число2> Истинно, если число <число1> больше или равно числа <число2>.
    Числами <число1> и <число2> могут быть положительные и отрицательные целые числа.


Пример: if [ -x /usr/games/pool ] ; then /usr/games/pool else echo "не могу запустить файл" fi

Этот же пример можно записать по-другому: [ -x /usr/games/pool ] && /usr/games/pool echo "не могу запустить файл"

Циклы реализуются с помощью конструкций for, while.

Цикл for записывается так:

for <переменная> in <список> do <команды> done

Пример 1:

for i in 1 2 3 do echo $i done

Пример 2:

for file in /etc/p* do echo $file done

Этот цикл эквивалентен команде ls /etc/p*.

Цикл while имеет вид: while <условие> do <команды> done

Команды в теле цикла выполняются до тех пор, пока остается истинным <условие>.

Пример:

i=1 while [ $i -lt 5 ] do echo $i i = $(($i+1)) # можно было бы написать i=`expr $i + 1` done

Другим вариантом цикла while является until.

until <условие> do <команды> done

В этом случае команды в теле цикла выполняются до тех пор, пока <условие> остается ЛОЖНЫМ. i=1 until ! [ $i -lt 5 ] do echo $i i=`expr $i + 1` done

Заметим, что по команде break можно выйти из тела цикла. Это справедливо и для цикла for и для while (until). Пример:

i=1 while [ $i -gt 0 ] do echo $i i=`expr $i + 1` if [ $i -eq 10 ] ; then break fi done


Содержание раздела