Башові умови в деталях
«Що якщо?» Це основне питання будь-якого розвитку подій. Що робити, якщо користувач клацне поле? Що робити, якщо значення 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; Триплет; Шарлотта Конібір