Поведение bash-оператора ++ утомлено константой

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

#!/bin/bash
echo "out1="$((++5))
echo "out2="$((5++))

Фрагмент кода выглядит примерно так; когда я его выполняю, я получаю следующий результат:

$ bash test.sh
out1=5
test.sh: line 3: 5++: syntax error: operand expected (error token is "+")

Версия bash: GNU bash, версия 4.2.46(2)-релиз (x86_64-redhat-linux-gnu)

Я хочу знать:

  1. почему нет синтаксической ошибки для оператора предварительного приращения?
  2. почему операция постинкрементного возврата возвращает значение 5, отличное от 6.

Благодарю.

1 ответ

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

  • Предварительное увеличение на самом деле не является предварительным увеличением, но вы можете поместить любое количество + а также - символы перед константой, чтобы определить, является ли она положительной или отрицательной. Я подозреваю, что парсер видит $(( +(+5) ))
    • резюме: вы просто указываете номер знака.
  • поскольку постинкрементная константа не имеет смысла (вы не можете присвоить константу 5 со значением 6), она воспринимается так, как если бы вы печатали "5 плюс... что-то", а вместо арифметического значения вы дали еще один плюс знак. Итак, синтаксическая ошибка и сообщение об ошибке операнда. Вроде парсер видит $(( (5) + (+) ))
    • Итог: первый плюс в порядке, второй - ошибка.
Другие вопросы по тегам