Почему Bash с опцией -e завершается, когда выражение let выражается в 0?

Я изо всех сил пытаюсь понять, почему Баш -e опция выходит из этого скрипта. Это происходит только тогда, когда вычисленное выражение дает 0:

#!/bin/bash
set -ex
table_year=( 1979 1982 1980 1993 1995 )
year=$1 
let indice=year-1
real_year=${table_year[$indice]}
echo OK $real_year

Это нормально, когда:

./bash_test_array 2

но не когда:

./bash_test_array 1 

indice этот случай равен 0, Почему -e вариант вызывает выход?

2 ответа

Увидеть help let:

Статус выхода: если последний ARG оценивается как 0, пусть возвращает 1; пусть возвращает 0 в противном случае..

Поведение let встроенный такой же, как для обычно используемых expr команда:

Состояние выхода [...] 1, если EXPRESSION равно нулю или 0 [...]

Вместо этого вы можете использовать арифметическое расширение:

indice=$(( year - 1 ))

Этот оператор вернет 0, даже если назначенное выражение оценивается как 0.

Вы можете использовать следующий трюк:

let indice=year-1 || true
Другие вопросы по тегам