if <вираз 1>
then <оператори 1>
elif <вираз 2>
then <оператори 2>
else <оператори 3>
fi
7 Оператор-перемикач
Існує спеціальний оператор, який зручно використовувати при великій кількості розгалужень. Оформити такий запис дозволяє оператор case, формат якого такий:
case var in
S1) <оператори 1>;;
S2) <оператори 2>;;
S3) < оператори 3>;;
*) <оператори 4>;;
esac
В залежності від того, чи збігається значення змінної var із значенням S1, S2 або S3, виконуються відповідно <оператори 1>, <оператори 2> або <оператори 3>. Якщо вказаного збігу немає, тоді виконуються <оператори 4>.
8 Оператор циклу for
Оператор for має декілька форматів. Найпростіший формат цього оператор циклу, який використовує одновимірний список, має такий вигляд:
for var in list
do
<оператори>
done
В даному випадку <оператори> виконуються по одному разу для кожного значення змінної var із списку list. Приклад сценарію для знаходження суми елементів одновимірного масиву:
#! /bin/bash
mas=’3 7 12 5 8’
sum=0
for var in $mas
do
let sum=$sum + $var
done
echo “result is $sum”
Формат циклу for з використанням масивів дуже схожий на відповідний формат циклу в мові Сі.
Приклад сценарію з використанням циклу for для знаходження максимального значення серед елементів одновимірного масиву:
#! /bin/bash
mas [0] =3
mas [1] =7
mas [2] =12
mas [3] =5
mas [4] =8
max=mas [0]
for((i=0; i<5; i++))
do
if [$m ax –lt ${mas [i] }]
then let max=${mas [i] }
fi
done
echo “result is $max”
9 Оператори циклу while та until
Оператор циклу while можна використовувати для повторного виконання <операторів> до тих пір, поки заданий <вираз> буде залишатись істинним:
while <вираз>
do
<оператори>
done
Можливо, що цикл не буде виконано жодного разу, якщо заданий <вираз> виявиться хибним з самого початку.
Приклад сценарію з використанням циклу for для знаходження максимального значення серед елементів двовимірного масиву, який вводиться із клавіатури:
#! /bin/bash
for((i=0; i<5; i++))
do
for((j=0; j<5; j++))
do
read mas [i] [j]
done
done
max=mas [0]
for((i=0; i<5; i++))
do
for((j=0; j<5; j++))
do
if [$max –lt ${mas [i] [j] }]
then let max=${mas [i] [j] }
fi
done
done
echo “result is $max”
Оператор циклу until можна використовувати для повторного виконання <операторів> до тих пір, поки заданий <вираз> буде залишатись хибним:
until <вираз>
do
<оператори>
done
10 Функції
Як і в мовах високого рівня, окремі частини сценаріїв можна записувати у вигляді функцій. Формат визначення функції такий:
func() {
<оператори>
}
Виклик функції, якій передаються параметри param1, param2, param3:
func param1 param2 param3
Можна також передати параметри у вигляді одного рядка, наприклад, $@. Функція може інтерпретувати параметри за тими же принципами, за якими виконується інтерпретація позиційних параметрів, що передаються сценарію оболонки. Наприклад, для обчислення виразу
можна використати дві функції:
#! /bin/ bash
a = 9
b = 5
c = 7
d = 2
calc1() {
let y= ($a+$b) /$1
echo “Result is $y”
}
calc2() {
let y = ($a+$b) *$1
echo “Result is $y”
}
echo “input x”
read x
if [$x - eq 5]
then calc1 c
else calc2 d
fi
11 Робота з файлами
Використовуючи файлові операції порівняння, можна із заданого списка імен знаходити файли або каталоги, а також визначати їх права доступу. Наприклад:
#! /bin/ bash
if [- d name1]
then echo “ name1 is directory”
el if [- f name2]
then echo “ name2 is file”
else echo “ name1 and name2 is not directory or file”
fi
if [- w name2]
then echo “ file has write permission”
else echo “ file has not write permission”
fi
В системних сценаріях Linux часто зустрічаються випадки, коли потрібно виконати задану послідовність операцій в залежності від інформації, яка записана у відповідних файлах. Складемо сценарій, в результаті виконання якого на екрані з’являється вікно системної програми годинника або калькулятора, якщо у файлі /home/user/Select. txt змінній Program присвоєно значення відповідно “XCLOCK” або “XCALC”. Звертаємо увагу, що цей сценарій може бути виконано лише в графічній оболонці X (детальніше графічний режим Linux розглядається в наступній лабораторній роботі).
#! /bin/ bash
. /home/user/Select. txt
if [“$Program” = “XCLOCK”]
then exec xclock &
elif [“$Program” =“XCALC”]
then exec xcalc &
fi