Аргументи командного рядка. Аналогічно тому, як це робиться в командах UNIX, в скриптах можна використовувати аргументи

Аналогічно тому, як це робиться в командах UNIX, в скриптах можна використовувати аргументи. Аргументи вводяться при виклику командного файла після його імені і нумеруються, починаючи з 1. Перший аргумент програми, що оброблюється, позначається $1, другий - $2, і т.ін. Аргумент $0 - це ім'я програми, що виконується на даний момент (назва оболонки, або командного файлу) - фактично перше слово в командному рядку. Аргументи можуть розглядатися як локальні змінні процесу. Існують і інші спеціальні змінні, пов'язані з характеристиками командного рядка і процесу (див. Додаток Г).

6.1.14 Арифметичні операції

В оболонці bash присутня команда let, яка дозволяє виконувати операції з арифметичними величинами. За допомогою цієї команди можна порівнювати числа і виконувати з ними такі операції, як додавання або множення. Команда let може замінюватися подвійними круглими дужками. Оператори let, що співпадають зі спеціальними символами оболонки, брати в лапки не потрібно. Якщо операнди арифметичного виразу розділені пропусками, цей вираз слід взяти в лапки. Наприклад:

$ let "res = 2 * 7"

$ echo $res

$

6.1.15 Команда порівняння test

Часто буває необхідно виконати перевірку, в ході якої порівнюються дві величини або перевіряється наявність того або іншого файлу. За допомогою команди test можна порівнювати цілі числа, рядки, і виконувати логічні операції. Результат перевірки - це код завершення операції test, який, як було сказано раніше, зберігається в спеціальній змінній $?. Замість ключового слова test можна використовувати квадратні дужки. Наприклад:

$ greeting="hallo"

$ num=5

$ test $num -eq 5 ; echo $?

$ [ $greeting = "hallo" ] ; echo $?

$ test -f main.c ; echo $?

В даному прикладі ми ініціалізуємо дві змінні. Потім виконуємо перевірки на рівність їх тому або іншому значенню (зверніть увагу, що рядки порівнюються за допомогою оператора =, а численні значення - за допомогою опції -eq). Остання перевірка - це перевірка наявності файлу main.c в поточному каталозі. Результат – неправда (файл не знайдено). Операції команди test наведені у Додатку Д.

Умови

В оболонці bash є набір умовних керуючих структур, які забезпечують умовне розгалуження програм. Багато з цих структур аналогічні умовним керуючим структурам мов програмування, але є деяка різниця.

Конструкція if ставить умову для виконання команди. Цією умовою є код завершення якоїсь конкретної команди. Якщо команда виконана успішно (код завершення дорівнює нулю), то команди всередині структури if виконуються. В іншому випадку виконується гілка else (якщо вона присутня) або керування передається наступному за if-конструкцією оператору. Керуюча структура if повинна закриватися ключовим словом fi (if навпаки). Синтаксис if-конструкції такий:

if <команда-умова>

then

<команди>

else

<команди>

fi

В якості команди-умови як правило використовується команда test або її альтернативна форма - квадратні дужки [].

Вкладення умов if здійснюється за допомогою структури elif. Вкладеність elif не обмежується. Остання гілка каскаду elif повинна починатися зі слова else:

if <команда-умова>

then

<команди>

elif

<команди>

else

<команди>

fi

Керуюча структура case забезпечує вибір одного з кількох можливих варіантів. Вибір здійснюється шляхом порівняння заданого в структурі значення з кількома можливими зразками. Кожне можливе значення змінної, що перевіряється (зразок) пов'язується з сукупністю операцій. Кожен зразок являє собою регулярний вираз, що завершується круглою дужкою. Список команд, що виконуються завершується двома крапками з комами, що стоять на окремому рядку. Вся конструкція завершується ключовим словом esac (case навпаки). Синтаксис структури:

case <рядок> in

зразок)

команди

;;

зразок)

команди

;;

*)

команди по замовчуванню

;;

esac

Зразок може містити спеціальні символи: *, [], ?, |. Варіант по замовчуванню включати до структури не обов'язково.

Цикли

Командний інтерпретатор дозволяє створювати гнучкі циклічні структури. Конструкція while забезпечує виконання окремої команди, доки виконується умова (код виконання команди-умови дорівнює нулю). Замикає конструкцію ключове слово done:

while <команда-умова>

do

команди

done

Як і в if-структурі, команда-умова частіше всього представляється перевіркою test (або квадратними дужками).

Цикл until аналогічний циклу while. Він відрізняється тим, що команди тіла циклу виконуються до того часу, доки умова залишається НЕ виконаною:

until <команда-умова>

do

команди

done

Структура for-in призначена для послідовного звернення до значень, перерахованих у списку. В ній два операнди - змінна і список значень. Кожне зі значень по черзі присвоюється змінній структури. Цикл завершується, коли всі значення зі списку будуть вичерпані. Тіло циклу поміщується в операторні дужки do-done, синтаксис конструкції for-in:

for <змінна> in <список_значень>

do

команди

done

Структура for без явно заданого списку значень використовує в якості такого аргументи командного рядка. При першому проході змінній присвоюється значення першого аргументу командного рядка, при другому - значення другого, та ін.

6.1.18 Приклади скриптів

Розглянемо простий інтерактивний скрипт whoareyou. Нижче наводиться його текст:

echo What is your name? (1)

read reply (2)

case $reply in (3)

root) (4)

echo You are system administrator of $HOSTNAME (5)

;; (6)

stud) (7)

echo You are a student (8)

;; (9)

*) (10)

echo You are a mortal user on $HOSTNAME (11)

;; (12)

esac (13)

Скрипт пропонує користувачеві відрекомендуватися (рядок 1). Користувач вводить своє ім'я, яке заноситься в змінну reply. Далі відбувається розгалуження в залежності від значення reply (іншими словами, в залежності від відповіді користувача). Скрипт друкує одне з трьох повідомлень. При друку використовується значення іншої змінної - HOSTNAME. Вона визначається безпосередньо системою і містить мережеве ім'я UNIX-машини, на котрій виконується скрипт.

Розглянемо інший приклад. Іноді, при великій кількості файлів, буває важко за ними услідити. Наведена нижче програма chkown дозволяє знаходити файли, які не належать користувачеві.

for filename in `ls` (1)

do (2)

if [ ! -O $filename ]; then (3)

echo $filename does not belong to `whoami` (4)

fi (5)

if [ -d $filename -a -x $filename ]; then (6)

echo Entering $filename ... (7)

cd $filename (8)

$0 (9)

Echo Leaving $filename ... (10)

cd .. (11)

fi (12)

done (13)

Розглянемо дію скрипта порядково.

В першому рядку ініціалізується for-цикл. Змінною циклу є filename. Список значень визначається результатом роботи команди ls (вона поміщена в зворотні лапки). Іншими словами, змінна filename по черзі приймає значення імен файлів і каталогів поточної директорії.

В рядку 3 відбувається перевірка, чи належить файл або каталог користувачеві, який запустив скрипт (операція -O команди test). Зауважимо, що якщо ключове слово then стоїть на тому ж рядку, що і умова, воно повинно відокремлюватися крапкою з комою (;). Якщо користувач не є хазяїном файлу (знак оклику - логічне заперечення), то друкується повідомлення (рядок 4). При виконанні рядка 4 замість `whoami` в команду echo підставляється ім'я користувача (зворотні лапки).

В рядку 6 відбувається подвійна перевірка: чи є значення змінної filename каталогом (операція -d), і чи є значення змінної filename файлом, виконавчим для користувача (-x). Обидва логічних результата перемножуються (операція -a відповідає логічному "І") і, згідно кінцевому результату, гілка then виконується або не виконується. Як відомо, права на виконання каталогу визначають можливість користувача увійти в нього (cd).

Якщо змінна filename дійсно містить ім'я доступного каталогу, скрипт входить в нього (рядок 8) і рекурсивно запускає самого себе уже в цьому каталозі (в рядку 9 змінна $0 відповідає імені виконавчої програми, тобто імені скрипта). Після завершення роботи цього другого скрипта, керування повертається в первинний процес, відбувається перехід в початковий каталог (рядок 11), і на цьому гілка then завершується.

Необхідно відзначити, що якщо шлях до даного скрипта не буде визначено в змінній PATH, то його виконання буде перерване вже на другому рівні, оскільки програма вже покине початковий каталог (каталог першого рівня), в якому знаходиться файл chkown. Команда в рядку 9 не містить абсолютного імені файлу, тому скрипт звернеться до змінної PATH і почне його пошук у всіх визначених там каталогах.

Наши рекомендации