Поведение 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)
Я хочу знать:
- почему нет синтаксической ошибки для оператора предварительного приращения?
- почему операция постинкрементного возврата возвращает значение 5, отличное от 6.
Благодарю.
1 ответ
Не могу сказать наверняка, мне не хочется просматривать исходный код, чтобы узнать о парсере арифметических выражений. Мое предположение:
- Предварительное увеличение на самом деле не является предварительным увеличением, но вы можете поместить любое количество
+
а также-
символы перед константой, чтобы определить, является ли она положительной или отрицательной. Я подозреваю, что парсер видит$(( +(+5) ))
- резюме: вы просто указываете номер знака.
- поскольку постинкрементная константа не имеет смысла (вы не можете присвоить константу 5 со значением 6), она воспринимается так, как если бы вы печатали "5 плюс... что-то", а вместо арифметического значения вы дали еще один плюс знак. Итак, синтаксическая ошибка и сообщение об ошибке операнда. Вроде парсер видит
$(( (5) + (+) ))
- Итог: первый плюс в порядке, второй - ошибка.