Доброго утра.
Допустим, у меня есть код со следующей арифметической операцией:
(( TOKEN_COUNTER++ ))
При включенном set -e
этот код совершенно правомерно может завалить скрипт, поскольку здесь ((
воспринимается как бы как команда; в свою очередь, эта команда при (( 0 ))
возвращает 1, и именно это сваливает скрипт.
Это один из вариантов решения:
(( TOKEN_COUNTER++ )) || :
Но, может быть, есть что-нибудь, что можно использовать, не вдаваясь в подробности насчёт того, является ли ((
какой-то там встроенной командой и возвращает ли она что-то там при определённых условиях? Хочется чего-то такого:
do_it_carefree (( TOKEN_COUNTER++ ))
Как это сделано в выражениях вроде if, while, until - и им подобных. В них и инкремент к переменной можно сделать, и отрицательный код возврата не валит скрипт, а останавливает выполнение кода под выражением.
Я было подумал про let
, но это оказалось тем же самым, что и ((
:
((expression)) The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the return status is 1. This is exactly equivalent to let «expression».
Алсо, есть ещё непонятки с вариантами стрельбы по ногам с включенной обработкой нештатных ситуаций.
$ a() { return 1; }
$ : $(a); echo $?
0
$ b=$(a); echo $?
1
Может быть, вы можете что-нибудь сказать на этот счёт, что прояснило бы как-то такое поведение, чтобы не оставаться просто так с опытом «так надо делать, а так - не стоит»?
ABW?