(( ))
- это расширение "арифметической команды", взятое из ksh, позволяющее использовать математический синтаксис в стиле C в сценариях оболочки (POSIX определяет $((...))
в качестве синтаксиса расширения; ((...))
в качестве синтаксиса команды является элементом это расширение). Таким образом, его целью является совместимость с реализацией ksh - и, однозначно, это отдельная команда, оканчивающаяся на ))
. В отличие от [
- обычная команда без специальной обработки времени анализа [1] - это синтаксически значимо (синтаксический анализатор должен вести себя по-разному внутри ((
и, следовательно, должен знать об этом), поэтому синтаксический анализатор знает, когда арифметическая команда закончилась.
До bash 2.05 после нее был необходим разделитель команд, даже в условном контексте. Однако это было несовместимо с вышестоящей реализацией ksh, и поэтому bash был изменен, чтобы явно не требовать разделитель в этом контексте.
[1] - [
имеет встроенную реализацию в bash, но она включается только при диспетчеризации команд, а не во время разбора.