Отсутствует точка с запятой в `if ((...)) then` и нет синтаксической ошибки? - PullRequest
0 голосов
/ 27 августа 2018

Кто-то указал пропущенную точку с запятой в простом сценарии оболочки, и мне любопытно, почему он не выдает синтаксическую ошибку.

Полный скрипт:

interval () {
    INTERVAL="$*"
    WHEN_TO_RUN=0
    while read LINE; do
        if (( $(epoch 0S) >= $WHEN_TO_RUN )) then
            echo $LINE
            WHEN_TO_RUN="$(epoch $INTERVAL)"
        fi
    done
}

рассматриваемая строка:

if (( $(epoch 0S) >= $WHEN_TO_RUN )) then

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

if [ $(epoch 0S) -ge $WHEN_TO_RUN ]; then

в OSX, если необходимо

1 Ответ

0 голосов
/ 27 августа 2018

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

До bash 2.05 после нее был необходим разделитель команд, даже в условном контексте. Однако это было несовместимо с вышестоящей реализацией ksh, и поэтому bash был изменен, чтобы явно не требовать разделитель в этом контексте.


[1] - [ имеет встроенную реализацию в bash, но она включается только при диспетчеризации команд, а не во время разбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...