28.05.2011

Основы Shell Script. Часть II.

Условный оператор if. Оператор if в shell выглядит следующим образом:
if 
 условие 
then
 команды, если условие верно
else
 команды, если условие ложно
fi
Естественно, возможна запись сокращенного варианта, без else. При  создании цепочек  вложенных операторов - if else if, вместо else if можно использовать сокращенный вариант - elif.  Условие считается истинным, если код завершения команды равен 0. В условии может стоять любая команда. Для того чтобы проверить различные условия сравнения и не только используется команда test. Эта же команда может быть записана в более удобном виде: [ ]   - в скобках помещается само условие (между скобками и условием обязательно должны быть пробелы). Пример:
#!/bin/sh 
 a=test
 b=test 
if [  $a = $b ]
then
  echo "a=b"
fi

Здесь выполняется проверка строк a и b, и, соответственно, будет выведено сообщение "a=b". С помощью test можно проверять различные условия: Для строк: a = b  - строки a и b совпадают a != b  - строки не совпадают -n a   - строка a  не пустая -z a  - строка a пустая Для целых чисел (строки будут интерпретированы как числа): a -eq b - a равно b  a -ne b - a не равно b a -gt b - a больше b  a -ge b - a больше или равно b a -lt b - a меньше b a -le b - a меньше или равно b   Для файлов: -f file - файл является обычным файлом -d file - файл является каталогом -с file - файл является специальным -r file - есть права на чтение -w file - есть права на запись  В условиях можно использовать логические операции И, ИЛИ, НЕ: ! - НЕ -o - ИЛИ -a - И Например, здесь проверяется условие "если a не равно b И с равно 0":

#!/bin/sh 
 a=5; b=10; c=0
if [ $a -ne $b -a $c -eq 0 ]
then 
  echo OK
else 
  echo Error
fi 

Оператор case.

Оператор выбора case выглядит так:

case строка
  шаблон) команды;;
  шаблон) команды;;
  *) команды;; 
  ... 
esac 

Если значение строки не совпало  ни с одним из шаблонов, то выполняются команды  после *). Разумеется, можно и не указывать *), если в этом нет необходимости. 

Циклы.

В shell есть три типа циклов - с перечислением (for), с истинным условием (while) и с ложным условием (until).

for имя_переменной [ in список значений ]
do
  ... 
done

Переменной, являющейся параметром цикла, присваиваются значения, перечисленные в списке. Запись " for имя_переменной in * " означает выполнение цикла для всех файлов текущего каталога.

#!/bin/sh
for i in $*
do
  echo $i
done  

В этом примере будут последовательно отображены параметры командной строки, переданные при вызове сценария. $* - переменная, содержащая  эти параметры.

while условие
do
...
done

Здесь все очень просто - команды, помещенные между do и done будут выполняться до тех пор, пока верно условие. Напомним, что условие считается верным, если код завершения команды, стоящей в условии, равен нулю. 

unitl условие 
do
...
done

Цикл until аналогичен предыдущему, но отличается тем, что команды будут выполняться до тех пор, пока условие ложно.  Во всех циклах можно применять ключевые слова break и continue. Первое означает, что из цикла необходимо выйти досрочно, выполнение команд, помещенных в тело цикла прекращается; continue используется для того,  чтобы перейти досрочно на следующее повторение цикла. Т.е. если достигнув какой-то команды в цикле нет необходимости выполнять следующие, но нужно начать цикл с начала. Пример:

#!/bin/sh
a=5
while [ $a -lt 10 ]
do
 echo $a
 a=`expr $a + 1`

 if [ $a -eq 7 ]
 then
   break
 fi 
done 

Условием цикла здесь является a < 10, в теле цикла переменная a увеличивается на еденицу. Однако цикл завершится досрочно, когда значение a будет равно 7, так как при этом выполнится оператор break. 

Функции.

Функции в shell обозначаются так:

имя_функции()
{
 ...
}   

После описания функции, к ней можно обращаться по имени, так же как к любой другой команде. Функции можно передавать аргументы, только не так как это делается чаще всего в других языках программирования - в скобках, а с помощью позиционных параметров. Т.е. точно так же как вызов какой -либо внешней команды с аргументами командной строки. Выполнение функции можно прервать с помощью оператора return. С помощью него же можно возвратить код завершения (return 0; return 1;), опять же - аналогия с выполнением внешней команды.  Ну вот, попытка кратко изложить shell script на нескольких страницах завершена. Этого уже достаточно, чтобы писать несложные скрипты. Для более детального ознакомления с shell можно порекомендовать книгу "А.Соловьев программирование на shell (UNIX)". И, разумеется, изучение соответствующих команд - это, пожалуй, ключевой момент.  



Теги: Unix shell

comments powered by Disqus