Если [ — встроенная функция, а [[ — ключевое слово, то что такое ((?

Если [ — встроенная функция, а [[ — ключевое слово, то что такое ((?

В соответствии сэта почта, [— встроенная функция и [[— ключевое слово. Поскольку их можно рассматривать как команду, все после [и [[рассматривается как аргументы команды и должно быть разделено пробелами, пока они не встретятся с конечным аргументом ]и]]

Но каков тип ((?

type ((

выдаст ошибку:

 bash: syntax error near unexpected token `('. 

Я обнаружил, что пробелы внутри не имеют значения (( )).

echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+  1))
echo $(( 1  +  1  ))

все одинаковы


краткое содержание

в соответствии сСтандартная документация POSIX: раздел «Группировка команд»

Если последовательность символов, начинающаяся с «((», будет интерпретироваться оболочкой как арифметическое расширение, если ей предшествует «$», оболочки, реализующие расширение, посредством которого «((expression))» оценивается как арифметическое выражение, могут рассматривать «((» как введение в качестве арифметической оценки вместо команды группировки. Соответствующее приложение должно гарантировать, что оно разделяет два начальных символа «(» пробелом, чтобы не дать оболочке выполнить арифметическую оценку.

Арифметическая оценка внутри ((...))соответствует стилю C. Поэтому пространство внутри не имеет значения.((...))

решение1

((не является словом. В отличие от [и [[, он не является частью списка слов, составляющих команду. Лучший способ думать о нем — как о знаке препинания. На самом деле, это два символа препинания, которые могут быть объединены или не объединены в один токен в зависимости от контекста. В этом отношении он похож на такие вещи, как >&и ||. Символы препинания обрабатываются лексером/парсером оболочки специальным образом.

((является половиной оператора, другая половина — )). Вместе они образуют оператор арифметического выражения, который имеет синтаксис «outfix». Грамматическая структура языков оболочек, таких как bash, не очень точно следует традиционному синтаксису языка программирования (например, существуют очень тесные связи между лексическим анализом и грамматическим разбором, поскольку знаки препинания имеют значение, зависящее от грамматического контекста), поэтому не всегда есть точно подходящие слова.

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

Связанный контент