Consider this (exemplary) bash script:
#!/bin/bash -e
errorExit() {
echo "" >&2
echo "ERROR (${var_scriptfilename}):" >&2
echo "An unhandled error occurred." >&2
intentionalExit 1
}
intentionalExit () {
trap - EXIT # Unregister the EXIT trap
exit $1
}
trap errorExit EXIT # Trap script errors
var_scriptfilename="$(basename "$0")"
# ==== START OF TEST ====
var_counter=0
((var_counter++))
echo "var_counter is $var_counter" >&2
# ===== END OF TEST =====
intentionalExit 0
If I run it in Cygwin's bash it produces the intended output:
var_counter is 1
However, if I run it on my Debian Squeeze box, which is its intended destination, I end up in the EXIT trap:
ERROR (test.increment.sh):
An unhandled error occurred.
...Why is that?
If I remove the -e option it works as expected on both systems, but I want to keep -e in use, obviously.
The slightly more cumbersome "universal" variant, var_counter=$(($var_counter+1))
, works with -e being set on both shells, but I would prefer to use the first notation (or something similar-looking) since it clearly sticks out as an increment operation when reading the code.
bash --version
on the Cygwin bash says:
GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.
On Debian, it is:
GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
I am intrigued as to why this is that way. Does anybody know the cause of this behavior?
Also, does anybody know of a similar-looking way to increment a variable in bash that I could use?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…