Лекція №24 - bash робота з рядками - Інформаційний конспект
Лекція №24 - bash робота з рядками
Це остання лекція присвячена вивченнюbash. Сьогодні ми поговоримо про роботу з рядками, а також обговоримо команди та конструкціїbash, які були втрачені у попередніх лекціях. Спочатку розглянемо одну з таких важливих конструкцій, а потім перейдемо до обробки рядків.
У багатьох скриптах системи ви можете побачити запис на кшталт цієї:
Потім створимо ще один файл-скрипт з ім'ямprintopt.sh у тому ж каталозі, що і файлtestopt :
Коли інтерпретаторbash почне розбирати при запуску скриптprintopt.sh, завдяки конструкції. testopt виконуваний файл буде для інтерпретатора мати такий вигляд:
Тобто місце. testopt підставляється вміст (текст) файлу testopt. Результат роботи скрипту:
/linux$ ./printopt.sh PRINT
Робота з рядками
Розглянемо кілька прийомів обробки рядків уbash. Допустимо є зміннаА, якій присвоєно рядок “QWERTY “. Щоб вивести вміст змінної на екран, достатньо написатиecho $A :
/linux$ A = QWERTY; echo $A QWERTY
Допустимо хочемо вивести такий рядок -QWERTASD. Варіант$AASD не спрацює, тому що дляbash —AASD буде неіснуючою змінною:
/linux$ A = QWERTY; echo $AASD
Тому слід записати так:$ASD :
Якщо потрібно відобразити рядок з N-го символу, тоді використовуємо конструкцію$ , деN — номер символу, з якого буде відображено рядок. Символи у рядку ведуть нумерацію з нуля. Щоб відобразитиERTY пишемо:
/linux$ A = QWERTY; echo $ ERTY
Тобто після двокрапки вказуємо кількістьсимволів, які потрібно пропустити.
Можна відобразити певну кількість символів, починаючи з певної позиції. Тоді записати потрібно так$ , де N — номер символу з якого буде відображено рядок, аM — кількість символів, що відображаються. Щоб вивести з нашого рядкаQWERTY символиER пишемо:
Щоб вивестиQWE пишемо так:
Розглянемо таку конструкцію:
$ A = "ABABABCDCD"; echo $ ABABCDCD igor@adm-ubuntu:
$ A = "123ABABABCDCD"; echo $ 123ABABABCDCD
Після символу# вказуємо шаблон, і якщо початок рядка збігається з цим шаблоном, рядок буде виведено без символів, що задовольняють шаблону. Рядок “123ABABABCDCD” починається з 12 і шаблон AB не спрацював, а от якщо написати#*AB (або#. AB ), то отримаємо наступний результат:
$ A = "123ABABABCDCD"; echo $ ABABCDCD igor@adm-ubuntu:
$ A = "123ABABABCDCD"; echo $ ABABCDCD
Подивіться результат виконання такої команди:
$ A = "123ABABABCDCD"; echo $ CDCD
Якщо у нас стоїть один знак# то від рядка відокремлюєтьсямінімум задовольняє шаблону. Тобто для“123ABABABCDCD” — це“123AB”. А якщо у нас два знаки##, то відокремлюєтьсямаксимально можлива частина, що задовольняє шаблону. Тобто Тобто для“123ABABABCDCD” — це“123ABABAB”, оскільки123ABABAB підходить під*.
Якщо необхідно таким же чином прибрати символи з кінця рядка, то замість# використовуємо%. Правила ті самі, що й для#.
$ A = "123ABABABCDCD"; echo $ 123ABAB igor@adm-ubuntu:
$ A = "123ABABABCDCD"; echo $ 123
Тепер подивимося, як уbash можна виконувати заміну символів у рядку. Допустимо потрібноу нашому рядку“123ABABABCDCD” замінити символиAB наZX, щоб вийшов рядок“123ZXZXZXCDCD”. Для цього використовуємо/ або// і пишемо так:
$ A = "123ABABABCDCD"; echo $ 123ZXABABCDCD igor@adm-ubuntu:
$ A = "123ABABABCDCD"; echo $ 123ZXZXZXCDCD
Дуже часто в скриптах необхідно перевірити чи існує змінна, і якщо не існує, то створити її та привласнити певне значення. Наведений нижче механізм застосовується у скриптах, які читають конфігураційні файли.
$ echo $options YES igor@adm-ubuntu:
Команду$ слід розуміти так: якщо зміннаoptions не існує, значить необхідностворити її та присвоїти значення“YES”, а якщо зміннаoptions існує, то використовуємо її справжнє значення. У команді з останнього прикладу (рядок 1), зміннаoptions не існувала, тому вона була створена і їй було надано значенняYES, в наступній команді (рядок 3), бачимо, що дійсно зміннаoptions була створена і їй було надано значення. У наступній команді (рядок 5) зміннаoptions була створена зі значеннямNO (тобто вона існувала до командиecho $ ) і тому було виведено саме це значення (NO ).
Якщо необхідно виконати таку ж операцію, але не надавати значення змінної, то пишемо замість=, символ— :
Тобто, якщо змінна немає, вона не створюється, а замість її неіснуючого значення використовується зазначене (у прикладі це“YES” ). Дана конструкція працює, якщо змінної не існує або вона існує, але зі значенням нульової довжини.
Якщо необхідно навпаки вивести якесь значення замість існуючоїзмінною, то застосовується така команда:
$ echo $options NO
Тобто якщо змінна існує і їй надано значення ненульової довжини, то вивести замість значення змінної зазначене значення, а саму зміннуне міняти.
Команда read
Для деяких видів скриптів (наприклад інсталяційних), необхідно, щоб користувач вводив якісь значення, і вони могли бути використані далі в скрипті. Для вирішення цього завдання вbash існує командаread. У найпростішому випадку команда записується так: read P1 P2 …. PN , де P1 … PN — це імена параметрів через пропуск. Командаread зчитує дані з потоку введення та записує їх у зазначені змінні. Як роздільник для введених даних командаread використовує значення, яке зберігається в системній зміноюbash —IFS. Як правило, це пробіл або табуляція. Розглянемо приклад скрипту:
І результат виконання:
/linux$ ./hello.sh Наберіть ваше ім'я та прізвище через пробіл і натисніть Enter: Igor Kuzmenko Ваше ім'я:Igor Ваше прізвище:Kuzmenko
Якщо змінити 5-й рядок скрипту наecho “Ваше прізвище:$”, то тоді, якщо не ввести прізвище буде виконано підстановку вказаного значення:
/linux$ ./hello.sh Наберіть ваше ім'я та прізвище через пробіл і натисніть Enter: Ігор Ваше ім'я:Ігор Ваше прізвище:Прізвище не було
Командаread може виконуватися з ключами. Найбільш значущі це:
-n - дозволяє задати кількість символів, яку необхідно вважати з потоку введення;-t — дозволяє встановити кількість секунд очікування даних. Якщо користувач нічого не ввів, то після закінчення цього часу команда завершиться помилкою і скрипт буде виконуватися далі.-s — забороняє відображення інформації, що вводиться на консолі. Використовується для введення конфіденційної інформації.
Довідку про командуread можна отримати з консолі за командоюhelp read.