[[ ]] vs [ ]

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

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

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

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

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

При использовании оператора < в двойных скобках экранирование не нужно.

#!/bin/sh
[ "$s < abc" ]

#!/bin/bash
[[ abc < abc ]]
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Ну и главная киллер-фича двойных скобок — это возможность пользоваться регулярными выражениями.

Примеры:

#!/bin/bash

s="abc123"
[[ "$s" == abc* ]]         # true (globbing)
[[ "$s" == "abc*" ]]       # false (literal matching)
[[ "$s" =~ [abc]+[123]+ ]] # true (regular expression)
[[ "$s" =~ "abc*" ]]       # false (literal matching)

Если заменить первую строчку на #!/bin/sh, то после запуска вылетит ошибка [[: not found.

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

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

Всем привет и увидимся!