Отличный результат от $ ((++ n)) при запуске bash vs dash - PullRequest
0 голосов
/ 24 сентября 2018

Я получаю разные выходные данные при запуске программы в bash и dash

#!/bin/sh

echo $SHELL
n=1
a=$((++n))
echo $n

Bash:

$ bash shell_test.sh
2

Dash:

$ dash shell_test.sh
1

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

dash - это оболочка Debian Almquist и крайне облегченная версия полной POSIX-совместимой реализации оболочки /bin/sh, цель которой - быть как можно меньше, создавая более быстрое время загрузки.

Операторы, такие как $((n++)), $((--n)) и аналогичные, являются функциями, которые не требуются POSIX и поэтому не реализованы.

Чтобы увидеть, как dash интерпретирует эти операторы, см. Чепнераответ

Хорошая страница, объясняющая, как сделать ваш скрипт POSIX-совместимым, здесь .


2.6.4 АрифметикаРасширение: Арифметическое расширение предоставляет механизм для вычисления арифметического выражения и подстановки его значения.Формат для арифметического расширения должен быть следующим:

$((expression))

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

Затем оболочка должна обработать это как арифметическое выражение и подставить значение выражения.Арифметическое выражение должно обрабатываться в соответствии с правилами, приведенными в Арифметическая точность и операции , со следующими исключениями:

  • Требуется только длинная целочисленная арифметика со знаком.
  • Только константы десятичной, восьмеричной и шестнадцатеричной констант, указанных в стандарте ISO C, раздел 6.4.4.1, должны распознаваться как константы.
  • sizeof() оператор и префикс и постфикс ++ и -- операторы не требуются.
  • Операторы выбора, итерации и перехода не поддерживаются.

источник: POSIX IEEE Std 1003.1-2017

0 голосов
/ 24 сентября 2018

Префикс ++ не требуется для POSIX, а dash не реализует его.Вместо этого он анализируется как два унарных оператора +:

$ n=1
$ echo $((+(+n)))
1
$ echo $((++n))
1
$ echo $n
1
...