Баш условия в детайли
„Ами ако?“ Това е основният въпрос за всяко развитие. Какво ще стане, ако потребителят щракне върху полето? Ами ако a има стойност между 4 и 10? Ами ако съществува файл XY? Какво ще стане, ако низ 1 се появи в низ 2? И какво, ако беше интуитивно разбираемо къде са разликите между [[]], [], (()) и теста?

Условията вдъхват живот на сценариите - без тях те биха могли да изпълняват само най-простите задачи и циклите ще работят вечно. За съжаление, условията в bash не са особено привлекателни за начинаещи.
Дори един напълно начинаещ веднага ще разбере заявка If, синтаксисът If-Then-Else е доста обяснителен (повече за цикли и заявки в Bash). Но скобите конструкции в заявките? Квадратни или кръгли скоби, кавички или не - или може би изобщо няма скоба?
Първото условие, с което се сблъсквате, вероятно е нещо като "[$ i -eq 5]" в if-заявка:
Трябва да се каже още веднъж, че простият знак за равенство се използва само за сравняване на низове; числовите стойности и други се сравняват с ==. И в тази проста стандартна заявка има още три интересни открития: От една страна, "ако" изобщо не е необходимо тук, от друга страна, скобите също не са - интервалите след/пред скобите, от друга страна, правят веднага щом се използват . Можете също да напишете:
Квадратните скоби не са нищо повече от различен начин за писане на инструмента "тест". Те просто правят по-сложните условия по-ясни и по-лесни за писане. И тъй като командата след "&&" се изпълнява само ако предишната команда отчита успех, "echo" започва само тук в примера, ако "var" всъщност е "Hello".
Двойните квадратни скоби, от друга страна, са специфично за Bash изпълнение, което обработва някои неща по-добре или по различен начин. Ако разгледате разликите между двете на базата на конкретни примери, имате хубава обща тема за изобщо да се приближите до bash условия.
След сравнението двойните кръгли скоби влизат в игра. Те до голяма степен съответстват на командата "let", която оценява аритметичните операции.
Условия с [и [[
Тест, [и [[предлагат три различни режима за сравнение: низове, числа и файлове. Както в горния пример, низовете просто се сравняват с "=" и "! =" (Неравномерни или не равни), така че:
Дори първото условие вече не работи, ако текстът в “$ a” съдържа интервали, например низът “Hello World”. След това се нуждаете от кавички - или двойни скоби:
Тестовият вариант се държи както обикновено и разделя променливи, които не са цитирани, вариантът на Bash се отказва от това. Това смекчава типичен източник на грешки. По-скоро обаче ...
използвайте, така че поставете RHS (дясната страна) в кавички. Тъй като [[овладява черупките и разбира всичко вдясно от оператора, което не е в кавички като 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" за "по-голямо или равно на" и т.н. Можете обаче да изчислявате и в двойни квадратни скоби!
По-вълнуващият вариант очевидно е специалистът тук, т.е.двойната кръгла скоба. От една страна има по-хубавият синтаксис с по-известните оператори:
В допълнение към такъв по-разбираем по-малък или равен оператор, конструкцията на скобата може да манипулира и нещо съвсем различно, а именно променливи в C-стил; често се използва за увеличаване на променливите за броене:
И двата цикъла дават един и същ резултат; при вариант while, използването освен условие става малко по-ясно.
За вкъщи
По принцип условията са сравнително прости и ясни, има само няколко аспекта, които трябва да се вземат предвид: Като цяло можете уверено да свикнете с двойните квадратни скоби и да използвате командата за тест, ако имате нужда от автоматичното разширение на името на файла
С [отново винаги трябва да помните, че RHS се третира като глобус без кавички. А с аритметичните оценки или операции е най-добре веднага да свикнете с двойните кръгли скоби: Тогава никога не трябва да преосмисляте от [[до ((, разпознавате аритметичните сравнения веднага от вида на скобите и можете също така да изчислявате с тях още по-лесно.
Урок за Python, част 7
Рекурсии и регулярни изрази
Извеждане с докато, докато и за
Внедрете цикли в bash
Този уебсайт е търговска марка на Vogel Communications Group. Можете да намерите преглед на всички продукти и услуги на www.vogel.de
StartupStockPhotos; Триплет; Шарлот Кони Биър