Рассмотрим этот (примерный) bash-скрипт:
#!/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
Если я запустил его в Cygwin bash, он выдаст желаемый результат:
var_counter is 1
Однако, если я запустил его в моем Debian Squeeze box, это его предполагаемый пункт назначения, я попадаю в ловушку EXIT:
ERROR (test.increment.sh):
An unhandled error occurred.
... Почему?
Если я удалю параметр -e, он будет работать должным образом в обеих системах, но я хочу, чтобы -e использовалась, очевидно .
Чуть более громоздкий «универсальный» вариант, var_counter = $ (($ var_counter + 1))
, работает с параметром -e, установленным в обеих оболочках, но я бы предпочел использовать первое обозначение. (или что-то подобное), поскольку при чтении кода она явно выделяется как операция приращения.
bash --version
в Cygwin bash говорит:
GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.
В Debian это:
GNU bash, Version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
I Меня заинтриговало, почему это так. Кто-нибудь знает причину такого поведения?
Кроме того, знает ли кто-нибудь похожий способ увеличения переменной в bash, который я мог бы использовать?