Безумовно, все ті хто спілкується з ОС Linux хоч раз так мали справу (у всякому разі чули точно) з командною оболонкою BASH. Але BASH не тільки командна оболонка, це ще й чудовий скриптова мова програмування.
Мета цієї статті - познайомити ближче користувачів з bash, розповісти про синтаксис, основні прийоми та фішки мови, для того щоб навіть звичайний користувач зміг швиденько написати простий скрипт для виконання щоденної (-недельной, -місячний) рутинної роботи або, скажімо, «на коліні »наваять скриптик для бекапа директорії.
BASH - Bourne-Again SHell (що може перекладається як «оновлений йшов», або «Знову йшов Борна (творець sh)»), найпопулярніший командний інтерпретатор в юніксоподобних системах, особливо в GNU / Linux. Нижче приведу ряд вбудованих команд, які ми будемо використовувати для створення своїх скриптів.
- break - вихід з циклу for, while або until
- continue - виконання наступної ітерації циклу for, while або until
- echo - висновок аргументів, розділених пробілами, на стандартний пристрій виводу
- exit - вихід з оболонки
- export - зазначає аргументи як змінні для передачі в дочірні процеси в середовищі
- hash - запам'ятовує повні імена шляхів команд, вказаних в якості аргументів, щоб не шукати їх при наступному зверненні
- kill - посилає сигнал завершення процесу
- pwd - виводить поточний робочий каталог
- read - читає рядок з введення оболонки і використовує її для присвоєння значень зазначеним змінним.
- return - змушує функцію оболонки вийти з вказаним значенням
- shift - переміщує позиційні параметри наліво
- test - обчислює умовний вираз
- times - виводить ім'я користувача і системний час, використане оболонкою і її нащадками
- trap - вказує команди, які повинні виконуватися при отриманні оболонкою сигналу
- unset - викликає знищення змінних оболонки
- wait - чекає виходу з дочірнього процесу і повідомляє вихідний стан.
І звичайно ж крім вбудованих команд ми будемо використовувати цілу купу зовнішніх, окремих команд-програм, з якими ми познайомимося вже в процесі
Що необхідно знати з самого початку
1. Будь-який bash-скрипт повинен починатися з рядка:
в цьому рядку після #! вказується шлях до bash-інтерпретатора, тому якщо він у вас встановлений в іншому місці (де, ви можете дізнатися набравши whereis bash) поміняйте її на ваш шлях.
2. Коментарі починаються з символу # (крім першого рядка).
3. В bash змінні не мають типу (про них мова піде нижче)
Змінні і параметри скрипта
Наведу як приклад невеликий приклад, який ми розберемо:
# Вказуємо де у нас зберігається bash-інтерпретатор
parametr1 = $ 1 # присвоюємо змінної parametr1 значення першого параметра скрипта
script_name = $ 0 # присвоюємо змінної script_name значення імені скрипта
echo "Ви запустили скрипт з ім'ям $ script_name і параметром $ parametr1" # команда echo виводить певну рядок, звернення до змінних здійснюється через $ ім'я_змінної.
echo 'Ви запустили скрипт з ім'ям $ script_name і параметром $ parametr1' # тут ми бачимо інші лапки, різниця в тому, що в одинарних лапках не відбувається підстановки змінних.
exit 0 # Вихід з кодом 0 (вдале завершення роботи скрипта)
Результат виконання скрипта:
Ви запустили скрипт з ім'ям ./test.sh і параметром qwerty
Ви запустили скрипт з ім'ям $ script_name і параметром $ parametr1
Після того як ми познайомилися як використовувати змінні і передавати скрипту параметри, час познайомитися з зарезервованими змінними:
Умовні оператори, думаю, знайомі практично кожному, хто хоч раз намагався на щось писати програми. В bash умови пишуться слід. чином (як зазвичай на прикладі):
source = $ 1 # в змінну source засовуємо перший параметр скрипта
dest = $ 2 # в змінну dest засовуємо другий параметр скрипта
if [[ "$ source" -eq "$ dest"]] # в лапках вказуємо імена змінних для порівняння. -eq - логічне порівняння позначають "рівні"
then # якщо вони дійсно рівні, то
echo "Пріменік $ dest і джерело $ source один і той же файл!"
exit 1 # виходимо з помилкою (1 - код помилки)
else # якщо ж вони не рівні
cp $ source $ dest # то виконуємо команду cp: копіюємо джерело в приймач
fi # позначаємо закінчення умови.
Результат виконання скрипта:
Пріменік 1 і джерело 1 один і той же файл!
Структура if-then-else використовується наступним чином:
if <команда или набор команд возвращающих код возврата(0 или 1)>
<если выражение после if истино, то выполняется этот блок>
<если выражение после if ложно, тот этот>
Як команд повертають код повернення можуть виступати структури [[. [. test, (()) або будь-яка інша (або кілька) linux-команда.
- test - використовується для логічного порівняння. після висловлення, неоьбходіма закриває дужка "]"
- [- синонім команди test
- [[- розширена версія "[" (починаючи з версії 2.02) (як в прикладі), усередині якої можуть бути використані || (Або), (І). Повинна мати закривающуб дужку "]]"
- (()) - математичне порівняння.
Для побудови багатоярусних умов виду:
для стислості і читання коду, можна використовувати структуру:
Умови. множинний вибір
Якщо необхідно порівнювати какао-то одну змінну з великою кількістю параметрів, то доцільніше використовувати оператор case.
echo "Виберіть редатор для запуску:"
echo "1 Запуск програми nano"
echo "2 Запуск програми vi"
echo "3 Запуск програми emacs"
read doing # тут ми читаємо в змінну $ doing зі стандартного введення
/ Usr / bin / nano # якщо $ doing містить 1, то запустити nano
/ Usr / bin / vi # якщо $ doing містить 2, то запустити vi
/ Usr / bin / emacs # якщо $ doing містить 3, то запустити emacs
*) # Якщо введено з клавіатури те, що в case не описується, виконувати наступне:
echo "Введено неправильне дію"
esac # закінчення оператора case.
Виберіть редатор для запуску:
1 Запуск програми nano
2 Запуск програми vi
3 Запуск програми emacs
Прведу список логічних операторів, які використовуються для конструкції if-then-else-fi:
- -z # рядок порожня
- -n # рядок не порожній
- =, (==) # рядки рівні
- != # Рядки нерівні
- -eq # одно
- -ne # нерівно
- -lt, (<) # меньше
- -le, (<=) # меньше или равно
- -gt, (>) # більше
- -ge, (> =) # більше або дорівнює
- ! # Заперечення логічного виразу
- -a, () # логічне «І»
- -o, (||) # логічне «АБО»
З основами мови і умовами ми розібралися, щоб не перевантажувати статтю, розіб'ю її на кілька частин (припустимо на 3). У другій частині розберемо оператори циклу і виконання математичних операцій.