Configuration Information [Automatically generated, do not change]: Machine: x86_64 OS: linux-gnu Compiler: gcc Compilation CFLAGS: -DPROGRAM='bash' -DCONF_HOSTTYPE='x86_64' -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='x86_64-pc-linux-gnu' -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/share/locale' -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H -I. -I../. -I.././include -I.././lib -D_FORTIFY_SOURCE=2 -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall uname output: Linux hdara1-wsl 3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux Machine Type: x86_64-pc-linux-gnu
Bash Version: 4.3 Patch Level: 11 Release Status: release Description: I have a few increment expressions used as ((level++)) and only one of those is giving an error. When used with set -e, bash aborts execution. Using ERR trap, I was able to identify the expression. Repeat-By: I have this simple logic in which I am running a sequence of commands conditionally, based on what a user provided level is. The intention is to only run those groups of commands appropriate for the level specified. To demonstrate the idea, here is a simple script: >>> CUT HERE <<< #!/usr/bin/env bash set -eEu -o pipefail trap 'echo "*** ERROR: Detected error on command: $BASH_COMMAND at line: $LINENO"' ERR DEBUG_LEVEL=$1 function debug_mode() { declare -i level=0 (( level >= DEBUG_LEVEL )) || { echo "Running: level $((level+1)) commands" ((level++)) } (( level >= DEBUG_LEVEL )) || { echo "Running: level $((level+1)) commands" ((level++)) } } debug_mode >>> CUT HERE <<< When this script works (as is the case on "GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)"), you would see the below interaction: $ debug.sh 0 $ debug.sh 1 Running level 1 commands $ debug.sh 2 Running level 1 commands Running level 2 commands However, when run on this version of bash (or even on GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)), the first "((level++))" results in an error: $ debug.sh 0 $ debug.sh 1 Running: level 1 commands *** ERROR: Detected error on command: ((level++)) at line: 8 If I replace the first "((level++))" with ": $((level++))" or "level+=1", then it goes through fine, and the second "((level++))" doesn't generate any error.