Башові умови в деталях

«Що якщо?» Це основне питання будь-якого розвитку подій. Що робити, якщо користувач клацне поле? Що робити, якщо значення a має значення від 4 до 10? Що робити, якщо файл XY існує? Що робити, якщо рядок 1 з’являється у рядку 2? А що, якби це було інтуїтивно зрозуміло, де різниця між [[]], [], (()) і тестом?

автоматичне розширення

Умови спочатку вдихають життя в сценарії - без них вони могли б виконувати лише найпростіші завдання, і цикли працювали б вічно. На жаль, умови в bash не особливо привабливі для початківців.

Навіть повністю новачок зрозуміє запит If одразу, синтаксис If-Then-Else досить зрозумілий (більше про цикли та запити в Bash). Але конструкції дужок у запитах? Квадратні або круглі дужки, лапки чи ні - або, можливо, взагалі відсутні?

Перша умова, з якою ви стикаєтесь, - це, мабуть, щось на зразок "[$ i -eq 5]" у запиті if:

Слід ще раз сказати, що простий знак рівності використовується лише для порівняння рядків; числові значення та інші порівнюються з ==. І в цьому простому стандартному запиті є ще три цікаві висновки: з одного боку, "якщо" тут взагалі не потрібно, з іншого боку, дужки теж не є - пробіли позаду/перед дужками, однак, робіть, як тільки вони використовуються . Ви також можете написати:

Квадратні дужки - це не що інше, як інший спосіб написання інструменту "тест". Вони просто роблять більш складні умови зрозумілішими та простішими для написання. І оскільки команда після "&&" виконується лише в тому випадку, якщо попередня команда повідомляє про успіх, "echo" починається тут лише в тому прикладі, коли "var" насправді "Hello".

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

Після порівняння в гру вступають подвійні круглі дужки. Вони значною мірою відповідають команді "let", яка оцінює арифметичні дії.

Умови з [та [[

Тест, [та [[пропонують три різні режими порівняння: рядки, числа та файли. Як і у прикладі вище, рядки просто порівнюються з "=" та "! =" (Нерівні чи не рівні), тому:

Навіть перша умова вже не працює, якщо текст у “$ a” містить пробіли, наприклад рядок “Hello world”. Тоді вам потрібні лапки - або подвійні дужки:

Тестовий варіант поводиться як зазвичай і розділяє незмінні змінні, варіант Bash відмовляється від цього. Це пом'якшує типове джерело помилок. Однак, скоріше ...

використовуйте, тож поставте RHS (Right Side) у лапки. Тому що [[освоює глобалізацію оболонки і розуміє все праворуч від оператора, що не в лапках, як glob. Це означає: Завдяки цій функції ви можете, наприклад, швидко перевірити, чи відповідає вміст змінної одному із рядків "foobar_1", "foobar_2" або "foobar_3":

Це чудова функція, але вона створює проблеми, якщо вміст змінної являє собою рядок із квадратними дужками, наприклад "[foobar]". Без лапок, дозволена змінна призведе до наступного твердження:

Це виглядає правильно, але RHS розглядається як глобус, скажімо “f або o або b. “, А LHS як струна. Тож, як правило, краще:

Потужна функція робить [[нарешті, вищим: використання оператора “=

"Можна порівняти з регулярним виразом, наприклад, наприклад:

^ [[: цифра:]] _ foobar]] && echo True

Вираз праворуч від знака рівності інтерпретується як POSIX базовий RegEx, тому "$ a" має починатися з 1 до 5 цифр і закінчуватися "_foobar".

Наступні відмінності між [та [[більше стосуються не лише рядків, а комбінацій та файлів.

Розширення та комбінації файлів

На додаток до операторів рядків, обидва інструменти пропонують всі види опцій для тестування на рівні файлу, наприклад, чи існує файл (-e), два файли ідентичні (-ef), файл існує та каталог (-d) тощо. . Сторінка [https://man.cx/test] надає повний огляд.

Цікавим тут є розширення файлів, тобто автоматичне розширення імен файлів, що показано в наступному прикладі:

Обидва варіанти закінчуються помилково - що сталося? [розширено зірочкою до всіх імен файлів у каталозі, тому в цьому прикладі він отримує два аргументи. Але оскільки очікується лише одне, твердження не відповідає дійсності. Це було б правдою лише в тому випадку, якщо б в каталозі був рівно один файл із розширенням “.txt”. [[не вдається з зовсім іншої причини: ім'я файлу не розширено - отже, тут шукається файл із назвою "* .txt".

Однак, якщо ви хочете дізнатись, чи існує хоча б один файл .txt, ви можете шукати його за допомогою grep та ls, а потім перевірити, чи рядок не порожній (-n):

Остаточна велика різниця зараз стосується комбінацій. Варіант [[тут просто спирається на дещо більш поширені позначення І та АБО:

Тож тут “$ a” повинен містити текст “Привіт” А “$ b” має бути “світовим” АБО “лісовим”. Тому тестова команда використовує "-a" та "-o", [[але "&&" та "||". Однак це лише питання стилю без подальшого впливу.

Арифметичні дії

Навіть при оцінці арифметичних операцій, [[перевершує команду тестування. В обох випадках порівняння просто проводяться із використанням абревіатури: "-eq" для "дорівнює", "-lt" для "менше", "-ge" для "більше або дорівнює" тощо. Однак можна також обчислити у подвійних квадратних дужках!

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

На додаток до такого більш зрозумілого оператора меншого чи рівного, конструкція дужок може також маніпулювати чимось зовсім іншим, а саме змінними у стилі С; часто використовується для збільшення змінних підрахунку:

Обидва цикли дають однаковий результат; у варіанті while використання, крім умови, стає трохи зрозумілішим.

Забирайте

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

З [[знову ж таки, ви завжди повинні пам’ятати, що RHS трактується як глобус без лапок. А з арифметичними обчисленнями або операціями найкраще звикати до подвійних круглих дужок: Тоді вам ніколи не доведеться переосмислювати з [[до ((, розпізнавати арифметичні порівняння відразу за типом дужок, а також можна легше обчислювати з ними.

Підручник з Python, частина 7

Рекурсії та регулярні вирази

Виведіть з while, до і for

Впровадити цикли в bash

Цей веб-сайт є товарним знаком Vogel Communications Group. Огляд усіх продуктів та послуг ви можете знайти на веб-сайті www.vogel.de

StartupStockPhotos; Триплет; Шарлотта Конібір