Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Linux

Чем отличаются двойные квадратные скобки от одинарных : Linux

20.06.2024 19:34


20.11.2023 14:55
Occul
 
[[ ]] vs [ ]

Как оказалось не каждый знает чем, отличается использование двойных квадратных скобок в скриптах от одинарных.

В контексте «не каждый», из 10 человек которых я опросил, правильно ответили лишь двое и то с присказкой - мне кажется и наверное.

Я тоже одно время не обращал на это внимание. Просто писал где-то одинарные, где-то двойные, наверное от погоды зависело. Но в какой-то момент меня это начало ковырять. Пришлось разобраться.

В общем как оказалось все просто. Скрипты с двойными скобками будут работать нативно в bash и ksh. А вот во всяких POSIX оболочках таких, как например sh (и в других на основе sh) - выпадет ошибка.

А еще в двойных скобках можно использовать операторы: ||, &&, <, ==, =~. А вот с sh такое провернуть не получится.

При использовании оператора < в двойных скобках, экранирование не нужно.
Код:
#/bin/sh
[ "$s < abc" ]

#/bin/bash
[[ abc < abc ]]
Ну и главная киллер-фича двойных скобок это - возможность пользоваться регулярными выражениями.

Примеры:
Код:
#/bin/bash

s="abc123"
[[ "$s" == abc* ]]         # true (globbing)
[[ "$s" == "abc*" ]]       # false (literal matching)
[[ "$s" =~ [abc]+[567]+ ]] # true (regular expression)
[[ "$s" =~ "abc*" ]]       # false (literal matching)
Если заменить первую строчку на #/bin/sh, то после запуска вылетит ошибка [[: not found.

Короче говоря, если хочешь чтобы твои скрипты работали везде, используй синтаксис с одинарными скобками. Но в свою очередь использование двойных скобок и связанных с ними фич, делают код более читаемым и ясным для понимания.

В общем я забил на переносимость между системами и теперь всегда использую только двойные скобки. Это как с табами и пробелами, главное однажды сделать выбор и потом этого выбора придерживаться.
Часовой пояс GMT +3, время: 19:34.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.