If условие
then
команды 1
elif
команды 2
else
команды 3
fi
В условных конструкциях сценариев можно использовать конструкцию test. Он может быть записан в формате test выражение или [выражение]. Последнее является конструкцией, в которой записывается операция сравнения с использованием приведенных выше обозначений. Приведем пример использования test
Текст сценария scr7 |
РЕЗУЛЬТАТЫ и пояснения |
#!/bin/bash
# 7 clear echo
a=test b=TEST c=test
test $a = $b echo " test 1 run cod " $?
test $a = $c echo " test 2 run cod " $?
C1=234 C2=234
[ $C1 -eq $C2 ] echo " test 3 eq " $?
[ $C1 = $C2 ] echo " test 4 = " $?
let d=$C1
[ $d = 234 ] echo " test 5 = " $?
[ $d -eq 234 ] echo " test 6 eq " $?
echo press key read q |
Если сценарий вызвать следующим образом, scr7 то получим следующие результаты.
test 1 run cod 1
test 2 run cod 0
test 3 eq 0
test 4 = 0
test 5 = 0
test 6 eq 0
press key
|
В языке сценариев оболочки используются операторы цикла. Они бывают трех типов. Первый из них записывается следующим образом:
whilе условие
do
команды
done
Пример записи оператора цикла в форме whilе для решения задачи вычисления факториала числа 5 может выглядеть так.
Текст сценария scr8 |
РЕЗУЛЬТАТЫ и пояснения |
#!/bin/bash
let p=5 let i=1 let f=1 while [ $i -le $p ] do let f=f*i let i=i+1 done echo " $p $f" echo echo press key read q |
Если сценарий вызвать следующим образом, scr8 то получим следующие результаты.
5 120
press key
|
Другая форма записи оператора цикла такая
until условие
do
команды
done
Приведем пример сценария, также реализующего задачу вычисления факториала с использованием until. Обращаем внимание на условие выполнения оператора цикла (-le) в первом случае и условия окончания (-gt) – во втором.
Текст сценария scr9 |
РЕЗУЛЬТАТЫ и пояснения |
#!/bin/bash
let p=5 let i=1 let f=1 until [ $i -gt $p ] do let f=f*i let i=i+1 done echo " $p $f" echo echo press key read q |
Если сценарий вызвать следующим образом, scr9 то получим следующие результаты.
5 120
press key
|
Последний вид оператора цикла имеет такой формат записи.
for var in список
do
команды
done
При такой записи оператора цикла переменная var последовательно приобретает значения из списка. Цикл выполняется столько раз, сколько элементов в списке. Вместо списка может быть записан шаблон имени файла. Тогда будут перебираться все файлы из текущего каталога, имя которых совпадает с шаблоном. Например, если после in записана *, то цикл выполнится столько раз, сколько файлов в текущем каталоге, а значения переменной var будет последовательно равно именам всех таких файлов
Приведем примеры сценариев с оператором for.
Текст сценария scr10 |
РЕЗУЛЬТАТЫ и пояснения |
#!/bin/bash
clear echo echo echo "= for 1 =" let l=0 for x in p q r do let l=l+1
echo " $l $x" done echo echo " = for 2 =" echo let l=1 for p in * do echo " $l $p" l=l+1 done echo echo " = for 3 =" echo let l=1 for p in * do if [ -f $p ]; then echo " $l $p" let l=l+1 fi done
echo press key read q |
Если сценарий вызвать следующим образом, scr10 то получим следующие результаты.
= for 1 = Список состоит из трех элементов и будет выполнен три раза. Параметр цикла х приобретет значения из этого списка. 1 p 2 q 3 r
= for 2 =
1 scr10
= for 3 =
2 scr10
press key
|
Следующая управляющая конструкция реализует структуру множественного выбора. Она записывается следующим образом
case слово in
шаблон 1)
команды
. . .
; ;
шаблон 2)
команды
. . .
; ;
*)
команды
. . .
; ;
esac
При совпадении значения слово с одним из шаблонов выполняются операторы до двойных символов «; ;». Далее сценарий продолжает выполнение со строки после ключевого слова esac.
Текст сценария scr11 |
РЕЗУЛЬТАТЫ и пояснения |
#!/bin/bash
clear echo case $1 in 0) echo Null ;; [1-9]) echo Anoder ;; [a|A]) echo a or A ;; *) echo NO !!! ;; esac
echo press key read q |
Если сценарий вызвать следующим образом, scr11 С то получим следующие результаты, зависящий от введенного С
С => 0 Null C 1 2...9 Anoter C a (A) a or A Другие случаи NO !!!
press key
|
Задание 39.
1. Создать командный файл, который при выполнении должен получить не менее двух параметров. Если количество переданных сценарию параметров ровно два, то на экране появляются их значения, в противном случае – вывести имя сценария и требование задать два параметра.
2. Создать сценарий, который проверяет наличие строки пользователя (имя пользователя вводится с клавиатуры – команда read) в файле /ets/passwrd.
3. Создать сценарий, в котором в специально созданную директорию /usr/temp (создать команду mkdir), копируется файл. Предварительно этот файл создается с клавиатуры командой cat. После создания директории высветить ее содержимое и сделать то же самое после копирования.
4. Создать командный файл, который считывает с клавиатуры имя файла и каталог, а затем копирует указанный файл в заданный каталог.
5. Создать сценарий, который спрашивает имя файла и определяет: имеется ли файл с таким именем в домашнем каталоге пользователя - /home/<имя пользователя>.
6. Создать командный файл, в котором над двумя заданными числами осуществляются следующие действия: эти числа складываются и перемножаются. Затем в цикле на экране распечатывается строки со словом Hello!. Количество строк равно минимальному из заданных чисел.
7. Создать командный файл, который по команде read запрашивает имя каталога и выдает его полное содержимое.
8. Создать командный файл, который по команде read запрашивает имя пользователя и выдает список, запущенных им процессов (вывести такие атрибуты процесса - PID, STAT, COMMAND, TIME, PRI, NI).