Відмінності між версіями «Умовні оператори»
(Створена сторінка: Даний топік є четвертим топиком циклу «Мова командного інтерпретатора bash». Він буде розп...) |
|||
Рядок 1: | Рядок 1: | ||
− | + | == Оператор варіантів case == | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Загальний синтаксис оператора case: | |
− | + | case значення in | |
− | + | ||
− | case значення in | + | |
шаблон1) список1;; | шаблон1) список1;; | ||
шаблон2 | шаблон3) список2;; | шаблон2 | шаблон3) список2;; | ||
esac | esac | ||
− | + | Логічна послідовність виконання оператора case: | |
− | + | а) шукається перший шаблон, що співпадає із значенням; | |
− | + | б) якщо він знайдений, виконується відповідний йому список команд, завершений ";;"; | |
− | + | в) управління передається операторам, наступним за конструкцією case. | |
− | + | Шаблон і список розділяються символом ")". Одному списку команд може відповідати кілька умов, тоді їх потрібно розділяти символом "|". | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Приклад використання конструкції case: | |
− | echo "Помилка. Кому відправити повідомлення?" | + | echo "Помилка. Кому відправити повідомлення?" |
− | echo "Начальнику: b" | + | echo "Начальнику: b" |
− | echo "Колегам: c" | + | echo "Колегам: c" |
− | echo "Нікому: any key" | + | echo "Нікому: any key" |
− | read answer | + | read answer |
− | case $ answer in | + | case $ answer in |
− | + | b | B) mail-s "error log" boss <error.log;; | |
− | + | c | C) mail-s "Help! error log"-c denis nick <error.log;; | |
− | + | *) Echo "error"; exit;; | |
− | esac | + | esac |
+ | == Умовний оператор if == | ||
− | + | Загальний синтаксис оператора if: | |
− | + | if список1 then | |
− | + | ||
− | if список1 then | + | |
список2 | список2 | ||
[Elif спісок3 then | [Elif спісок3 then | ||
Рядок 60: | Рядок 35: | ||
спісок5] | спісок5] | ||
fi | fi | ||
+ | Квадратні дужки тут вказують на необов'язкові конструкції. | ||
− | + | Логічна послідовність виконання оператора case: | |
− | + | а) виконується список1; | |
− | + | б) якщо він виконаний без помилок, виконується список2. В іншому випадку виконується список3, і якщо він завершується без помилок - список4. Якщо ж і список3 повертає код помилки, виконується список5; | |
− | + | в) управління передається операторам, наступним за конструкцією if. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Приклад використання if: | |
− | + | if grep-q Bash file; then | |
− | + | echo "Файл містить слово Bash." | |
− | + | fi | |
− | if grep-q Bash file; then | + | |
− | echo "Файл містить слово Bash." | + | |
− | fi | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | == Оператор test і умовні вирази == | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | У наведеному вище прикладі замість аналізу коду завершення використана перевірка умови. Дві форми такої перевірки еквівалентні: вбудована команда test і [умова]. Наприклад, для перевірки існування файлу потрібно написати: | |
− | + | test-e <файл> | |
− | + | або | |
− | + | [-E <файл>] | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | Команда test може перевіряти рядок на наявність символів. Непорожній рядок призводить до коду завершення 0. Порожній, відповідно - 1. Наприклад: | ||
+ | $ Test $ USER; echo $? | ||
+ | 0 | ||
− | + | Умовні вирази можна комбінувати за допомогою звичайних логічних операцій: | |
! <Вираз> - заперечення; | ! <Вираз> - заперечення; | ||
<Вираз1>-a <вираз2> - логічне І; | <Вираз1>-a <вираз2> - логічне І; | ||
<Вираз1>-o <вираз2> - логічне АБО. | <Вираз1>-o <вираз2> - логічне АБО. | ||
− | + | Елементарні умовні вирази для файлів: | |
-E - файл існує; | -E - файл існує; | ||
-F - звичайний файл (не каталог і не файл пристрою); | -F - звичайний файл (не каталог і не файл пристрою); | ||
Рядок 127: | Рядок 71: | ||
-C - файл є символьним пристроєм (клавіатура, модем, звукова карта і т.п.); | -C - файл є символьним пристроєм (клавіатура, модем, звукова карта і т.п.); | ||
-P - файл є каналом; | -P - файл є каналом; | ||
− | -H - файл є | + | -H - файл є символічним посиланням; |
− | -L - файл є | + | -L - файл є символічним посиланням; |
-S - файл є сокетом; | -S - файл є сокетом; | ||
-T - файл пов'язаний з термінальним пристроєм; | -T - файл пов'язаний з термінальним пристроєм; | ||
Рядок 137: | Рядок 81: | ||
-U - (suid) прапор для файлу встановлений; | -U - (suid) прапор для файлу встановлений; | ||
-K - прапор sticky bit встановлений; | -K - прапор sticky bit встановлений; | ||
− | -O - | + | -O - ви є власником файлу; |
-G - ви належите до тієї ж групи, що й файл; | -G - ви належите до тієї ж групи, що й файл; | ||
-N - файл був модифікований з моменту останнього читання; | -N - файл був модифікований з моменту останнього читання; | ||
Рядок 144: | Рядок 88: | ||
файл1-ef файл2 - файл1 і файл2 є «жорсткими» посиланнями на один і той же файл. | файл1-ef файл2 - файл1 і файл2 є «жорсткими» посиланнями на один і той же файл. | ||
− | + | Елементарні умовні вирази для порівняння рядків: | |
-Z рядок - довжина рядка дорівнює 0; | -Z рядок - довжина рядка дорівнює 0; | ||
-N рядок - довжина рядка не дорівнює 0; | -N рядок - довжина рядка не дорівнює 0; | ||
Рядок 151: | Рядок 95: | ||
рядок1 <рядок2 - рядок1 передує строке2 в лексикографічному порядку; | рядок1 <рядок2 - рядок1 передує строке2 в лексикографічному порядку; | ||
рядок1> рядок2 - рядок1 слід за строкой2 в лексикографічному порядку. | рядок1> рядок2 - рядок1 слід за строкой2 в лексикографічному порядку. | ||
− | + | ||
− | аргумент1 операція аргумент2 | + | Арифметичний умовний вираз має формат: |
+ | аргумент1 операція аргумент2 | ||
+ | де аргументами є цілі числа, і припустимі наступні операції: | ||
-Eq - рівно; | -Eq - рівно; | ||
-Ne - не одно; | -Ne - не одно; | ||
Рядок 163: | Рядок 109: | ||
> - Більше (всередині подвійних круглих дужок); | > - Більше (всередині подвійних круглих дужок); | ||
> = - Більше або дорівнює (всередині подвійних круглих дужок). | > = - Більше або дорівнює (всередині подвійних круглих дужок). | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Версія за 17:26, 6 грудня 2011
Оператор варіантів case
Загальний синтаксис оператора case:
case значення in шаблон1) список1;; шаблон2 | шаблон3) список2;; esac
Логічна послідовність виконання оператора case: а) шукається перший шаблон, що співпадає із значенням; б) якщо він знайдений, виконується відповідний йому список команд, завершений ";;"; в) управління передається операторам, наступним за конструкцією case. Шаблон і список розділяються символом ")". Одному списку команд може відповідати кілька умов, тоді їх потрібно розділяти символом "|".
Приклад використання конструкції case:
echo "Помилка. Кому відправити повідомлення?" echo "Начальнику: b" echo "Колегам: c" echo "Нікому: any key" read answer case $ answer in b | B) mail-s "error log" boss <error.log;; c | C) mail-s "Help! error log"-c denis nick <error.log;; *) Echo "error"; exit;; esac
Умовний оператор if
Загальний синтаксис оператора if:
if список1 then список2 [Elif спісок3 then спісок4] [Else спісок5] fi
Квадратні дужки тут вказують на необов'язкові конструкції.
Логічна послідовність виконання оператора case: а) виконується список1; б) якщо він виконаний без помилок, виконується список2. В іншому випадку виконується список3, і якщо він завершується без помилок - список4. Якщо ж і список3 повертає код помилки, виконується список5; в) управління передається операторам, наступним за конструкцією if.
Приклад використання if:
if grep-q Bash file; then echo "Файл містить слово Bash." fi
Оператор test і умовні вирази
У наведеному вище прикладі замість аналізу коду завершення використана перевірка умови. Дві форми такої перевірки еквівалентні: вбудована команда test і [умова]. Наприклад, для перевірки існування файлу потрібно написати:
test-e <файл>
або
[-E <файл>]
Команда test може перевіряти рядок на наявність символів. Непорожній рядок призводить до коду завершення 0. Порожній, відповідно - 1. Наприклад:
$ Test $ USER; echo $? 0
Умовні вирази можна комбінувати за допомогою звичайних логічних операцій:
! <Вираз> - заперечення; <Вираз1>-a <вираз2> - логічне І; <Вираз1>-o <вираз2> - логічне АБО.
Елементарні умовні вирази для файлів:
-E - файл існує; -F - звичайний файл (не каталог і не файл пристрою); -S - ненульовий розмір файлу; -D - файл є каталогом; -B - файл є блоковим пристроєм (floppy, cdrom і т.п.); -C - файл є символьним пристроєм (клавіатура, модем, звукова карта і т.п.); -P - файл є каналом; -H - файл є символічним посиланням; -L - файл є символічним посиланням; -S - файл є сокетом; -T - файл пов'язаний з термінальним пристроєм; -R - файл доступний для читання (користувачеві, що запустила сценарій); -W - файл доступний для запису (користувачеві, що запустила сценарій); -X - файл доступний для виконання (користувачеві, що запустила сценарій); -G - (sgid) прапор для файлу або каталогу встановлений; -U - (suid) прапор для файлу встановлений; -K - прапор sticky bit встановлений; -O - ви є власником файлу; -G - ви належите до тієї ж групи, що й файл; -N - файл був модифікований з моменту останнього читання; файл1-nt файл2 - файл1 новіший, ніж файл2; файл1-ot файл2 - файл1 старіший, ніж файл2; файл1-ef файл2 - файл1 і файл2 є «жорсткими» посиланнями на один і той же файл.
Елементарні умовні вирази для порівняння рядків:
-Z рядок - довжина рядка дорівнює 0; -N рядок - довжина рядка не дорівнює 0; рядок1 == рядок2 - рядки збігаються (аналог "="); рядок1! == рядок2 - рядки не збігаються (аналог "!="); рядок1 <рядок2 - рядок1 передує строке2 в лексикографічному порядку; рядок1> рядок2 - рядок1 слід за строкой2 в лексикографічному порядку.
Арифметичний умовний вираз має формат:
аргумент1 операція аргумент2
де аргументами є цілі числа, і припустимі наступні операції:
-Eq - рівно; -Ne - не одно; -Lt - менше; -Le - менше або дорівнює; -Gt - більше; -Ge - більше або дорівнює; <- Менше (всередині подвійних круглих дужок); <= - Менше або дорівнює (всередині подвійних круглих дужок); > - Більше (всередині подвійних круглих дужок); > = - Більше або дорівнює (всередині подвійних круглих дужок).