2015-03-31 7 views
2

Я пытаюсь понять, почему опция bash -e завершает этот скрипт. Это происходит только тогда, когда выражение вычисляется дает 0:Почему Bash с опцией -e выходит, когда выражение 'let' оценивается как 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 вызывает выход?

+0

https://www.gnu.org/software/bash/manual/html_node/ The-Set-Builtin.html – anishsane

+1

@Joe: Хотя причина может быть одинаковой, проблема в этом вопросе выражается гораздо проще, чем в этом другом вопросе (присваивание против приращения побочного эффекта). –

ответ

5

См help let:

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

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

статус Выхода есть [...] 1, если выражение пустой или 0 [...]

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

indice=$((year - 1)) 

Этот оператор возвращает 0, даже если назначенный выражение имеет значение 0.

+1

Определенно лучше, чем использовать 'let' – hek2mgl

+1

Я бы добавил, что ' indice = \ 'expr $ year - 1 \' ' имеет такое же поведение, как let. – PBrockmann

+0

@PBrockmann: Спасибо, 'expr'. –

1

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

let indice=year-1 || true