" /> " />

Більш просунутий при використанні

Це конструкція, яка використовується для виконання одного курсу дій, якщо команди if перевіряють істину, а інше - якщо перевіряє хибність. Приклад:

їсти трохи

freddy scripts> gender = "male" freddy scripts> if [["$ gender" == "f *"]] Більше вводу> тоді лунає "Рада познайомитися з вами, мадам". Більше вступних даних> else echo "Як це дама ще не випила?" Більше вхідних даних> fi Як, леді ще не випила? freddy сценарії>

На відміну від [, [[запобігає розбиттю слів змінних значень. Отже, якщо VAR = "var з пробілами", вам не потрібно двічі вводити $ VAR у тесті - навіть незважаючи на те, що використання лапок залишається хорошою звичкою. Крім того, [[запобігає розширенню імені шляху, тому буквальні рядки з узагальнюючими знаками не намагаються розширити до імен файлів. Використовуючи [[, == та! = Інтерпретуйте рядки праворуч як шаблони глобусів оболонки, які слід зіставити зі значенням зліва, наприклад: [["value" == val *]] .

Як і список CONSEQUENT-COMMANDS, що слідує за оператором then, список ALTERNATE-CONSEQUENT-COMMANDS після оператора else може містити будь-яку команду стилю UNIX, яка повертає статус виходу.

Інший приклад, що розширює приклад із розділу 7.1.2.1:

> su - Пароль: [root @ elegance root] # if! grep ^ $ USER/etc/passwd 1>/dev/null> тоді echo "вашим обліковим записом користувача не управляється локально"> else echo "вашим обліковим записом керується з локального файлу/etc/passwd"> fi вашим обліковим записом керується з локальний файл/etc/passwd [root @ elegance root] #

Ми переходимо до кореневого облікового запису, щоб продемонструвати ефект оператора else - ваш корінь зазвичай є локальним обліковим записом, тоді як вашим власним обліковим записом може керувати центральна система, наприклад, сервер LDAP.

Замість того, щоб встановлювати змінну, а потім виконувати скрипт, часто буває вишуканіше розміщувати значення змінних у командному рядку.

Ми використовуємо позиційні параметри $ 1, $ 2,. $ N для цієї мети. $ # відноситься до кількості аргументів командного рядка. $ 0 відноситься до назви сценарію.

Далі наведено простий приклад:

Малюнок 7-1. Тестування аргументу командного рядка за допомогою if

Ось ще один приклад, використовуючи два аргументи:

> cat weight.sh #!/bin/bash # Цей сценарій друкує повідомлення про вашу вагу, якщо ви надаєте йому свою # вагу у кілограмах та зріст у сантиметрах. вага = "$ 1" висота = "$ 2" ідеальна вага = $ [$ висота - 110], якщо [$ вага -le $ ідеальна вага]; потім луна "Ви повинні їсти трохи більше жиру". else echo "Вам слід з'їсти трохи більше фруктів". fi anny

> bash -x weight.sh 55 169 + вага = 55 + зріст = 169 + ідеальна вага = 59 + '[' 55 -le 59 ']' + echo 'Ви повинні їсти трохи більше жиру'. Ви повинні їсти трохи більше жиру.

У наступному прикладі показано, як змінити попередній сценарій так, щоб він друкував повідомлення, якщо задано більше або менше 2 аргументів:

> cat weight.sh #!/bin/bash # Цей сценарій друкує повідомлення про вашу вагу, якщо ви надаєте йому свою # вагу у кілограмах та зріст у сантиметрах. якщо [! $ # == 2]; потім луна "Використання: $ 0 weight_in_kilos length_in_centimeters" вихід fi вага = "$ 1" висота = "$ 2" ідеальна вага = $ [$ висота - 110], якщо [$ вага -le $ ідеальна вага]; потім луна "Ви повинні їсти трохи більше жиру". else echo "Вам слід з'їсти трохи більше фруктів". fi anny

> вага.ш 70 150 Ви повинні їсти трохи більше фруктів. анні

> weight.sh 70 150 33 Використання: ./weight.sh weight_in_kilos length_in_centimeters

Перший аргумент називається $ 1, другий - $ 2 і так далі. Загальна кількість аргументів зберігається в $ # .

Цей тест проводиться у багатьох сценаріях, тому що немає сенсу запускати багато програм, якщо ви знаєте, що вони не працюватимуть:

#!/bin/bash # Цей скрипт надає інформацію про файл. FILENAME = "$ 1" echo "Властивості для $ FILENAME:" if [-f $ FILENAME]; тоді echo "Розмір $ (ls -lh $ FILENAME | awk '< print $5 >') "echo" Тип $ (файл $ FILENAME | cut -d ":" -f2 -) "echo" Номер індексу $ (ls -i $ FILENAME | cut -d " -f1 -) "echo" $ (df ​​-h $ FILENAME | grep -v Встановлено | awk '< print "On",$1", \ which is mounted as the",$6,"partition.">') "else echo" Файл не існує. "fi

Зверніть увагу, що на файл посилається за допомогою змінної; у цьому випадку це перший аргумент сценарію. Крім того, коли аргументи не наводяться, розташування файлів зазвичай зберігаються у змінних на початку сценарію, і їх вміст посилається на ці змінні. Таким чином, коли ви хочете змінити ім'я файлу в сценарії, вам потрібно зробити це лише один раз.

Назви файлів із пробілами

Наведений вище приклад не вдасться, якщо значення $ 1 можна проаналізувати як кілька слів. У цьому випадку команду if можна виправити, використовуючи подвійні лапки навколо імені файлу, або за допомогою [[замість [ .

Це повна форма оператора if:

якщо ТЕСТУЮТЬ КОМАНДИ; тоді

elif БІЛЬШЕ ТЕСТОВИХ КОМАНД; тоді

Список TEST-COMMANDS виконується, і якщо його статус повернення дорівнює нулю, виконується список CONSEQUENT-COMMANDS. Якщо TEST-COMMANDS повертає ненульовий статус, кожен список elif виконується по черзі, а якщо його статус виходу дорівнює нулю, виконується відповідна MORE-CONSEQUENT-COMMANDS і команда завершується. Якщо за інакшим стоїть список ALTERNATE-CONSEQUENT-COMMANDS, а остання команда у кінцевому реченні if або elif має ненульовий статус виходу, тоді виконується ALTERNATE-CONSEQUENT-COMMANDS. Статус повернення - це статус виходу останньої виконаної команди, або нуль, якщо жодна умова не перевірена.

Це приклад, який ви можете помістити у свій crontab для щоденного виконання:

anny /etc/cron.daily> cat disktest.sh #!/bin/bash # Цей скрипт робить дуже простий тест для перевірки місця на диску. пробіл = `df -h | awk '' | grep% | grep -v Використовувати | сортувати -n | хвіст -1 | вирізати -d "%" -f1 -` alertvalue = "80" if ["$ space" -ge "$ alertvalue"]; потім луна "Принаймні один з моїх дисків майже заповнений!" | пошта -s "щоденна перевірка диска" root root echo "Дисковий простір нормальний" | пошта "щоденна перевірка диска" коренева fi

Всередині оператора if можна використовувати інший оператор if. Ви можете використовувати стільки рівнів вкладених if, скільки ви можете логічно керувати.

Це приклад тестування високосних років:

/ testdir> cat testleap.sh #!/bin/bash # Цей скрипт перевірить, перебуваємо ми у високосному році чи ні. year = `дата +% Y`, якщо [$ [$ year% 400] -eq" 0 "]; тоді луна "Це високосний рік. Лютий має 29 днів". elif [$ [$ year% 4] -eq 0]; тоді якщо [$ [$ year% 100] -ne 0]; тоді луна "Це високосний рік, у лютому 29 днів". else echo "Це не високосний рік. Лютий має 28 днів". fi else echo "Це не високосний рік. Лютий має 28 днів". fi anny

/ testdir> дата вт. 14 січня 20:37:55 CET 2003 рік

/ testdir> testleap.sh Це не високосний рік.

Вищезазначений сценарій можна скоротити за допомогою булевих операторів "AND" (&&) та "OR" (||).

Малюнок 7-2. Приклад використання булевих операторів

Серед інших редакторів, gvim - одна з тих, що підтримують кольорові схеми відповідно до формату файлу; такі редактори корисні для виявлення помилок у коді.

Оператор exit приймає необов’язковий аргумент. Цей аргумент є цілочисельним кодом стану виходу, який передається батьківському і зберігається в $? змінна.

Нульовий аргумент означає, що сценарій успішно запущений. Будь-яке інше значення програмісти можуть використовувати для передачі різних повідомлень батькові, щоб можна було вживати різні дії відповідно до невдачі або успіху дочірнього процесу. Якщо аргументу команді exit не вказано, батьківська оболонка використовує поточне значення $? змінна.

Нижче наведено приклад з трохи адаптованим сценарієм penguin.sh, який надсилає свій статус виходу батьківському, feed.sh:

/ testdir> cat penguin.sh #!/bin/bash # Цей скрипт дозволяє представити різні меню для Tux. Він буде щасливий # коли йому дадуть рибу. Ми також додали дельфіна та (імовірно) верблюда. якщо ["$ menu" == "риба"]; тоді якщо ["$ тварина" == "пінгвін"]; потім луна "Хм-м-м-м-м-м риба. Тукс щасливий!" elif ["$ animal" == "дельфін"]; потім луна "Pweetpeettreetppeterdepweet!" else echo "* prrrrrrrt *" fi else if ["$ animal" == "пінгвін"]; потім луна "Тукс не любить цього. Тукс хоче риби!" вихід 1 elif ["$ animal" == "дельфін"]; потім луна "Pweepwishpeeterdepweet!" вихід 2 else echo "Чи будеш ти читати цей знак ?!" вихід 3 fi fi

Цей сценарій використовується в наступному, який експортує меню змінних та тварину:

/ testdir> cat feed.sh #!/bin/bash # Цей скрипт діє за статусом виходу, який надає penguin.sh export menu = "$ 1" export animal = "$ 2" feed = "/ nethome/anny/testdir/penguin. sh "$ feed $ menu $ case для тварин $? в 1) ехо "Охоронець: Краще дай мені рибу, менше вони стануть жорстокими."; 2) луна "Охоронець: Це через таких, як ти, вони весь час залишають землю."; 3) луна "Охоронець: Купуй їжу, яку зоопарк забезпечує для тварин, ти ***, як ти думаєш, як ми виживаємо?"; *) луна "Охоронець: не забудь путівника!"; esac anny

/ testdir> ./feed.sh яблучний пінгвін Тукс цього не любить. Тукс хоче риби! Охоронець: Краще дай мені рибу, менше вони стануть жорстокими.

Як бачите, коди стану виходу можна обирати вільно. Існуючі команди зазвичай мають ряд визначених кодів; див. посібник програміста для кожної команди для отримання додаткової інформації.