ehime
ehime

Reputation: 8375

Bash incrementation breaking scripts

I'm having a weird issue incrementing a bash variable that seems to be breaking after my first attempt at incremntation that I cannot pin down, here is a sample of what I am doing and the debug output, anyone see any reason this should NOT work?

I am currently on GNU bash, version 4.2.45(1)-release (i686-pc-linux-gnu)

#!/bin/bash
set -ex 
declare -i elem=0
echo $elem # 0
    (( elem++ )) # breaks
echo $elem # 1 but never encountered
while IFS=$'\n' read -r line || [[ -n "$line" ]]; do
    (( elem++ ))
    echo $elem
done <"${1}" # foo\nbar\nbaz

Output

./incr.sh test
+ declare -i elem=0
+ echo 0
0
+ ((  elem++  ))

The weirdest part is by changing the initial incrementor to (( elem+=1 )) the entire program increments correctly, this seems extremely buggy to the eye...

#!/bin/bash
set -ex 
declare -i elem=0
echo $elem
    (( elem+=1 ))
echo $elem
while IFS=$'\n' read -r line || [[ -n "$line" ]]; do
    (( elem++ ))
    echo $elem
done <"${1}" # foo\nbar\nbaz

Output

+ declare -i elem=0
+ echo 0
0
+ ((  elem+=1  ))
+ echo 1
1
+ IFS='
'
+ read -r line
+ ((  elem++  ))
+ echo 2
2
+ IFS='
'
+ read -r line
+ ((  elem++  ))
+ echo 3
3
+ IFS='
'
+ read -r line
+ ((  elem++  ))
+ echo 4
4
+ IFS='
'
+ read -r line
+ [[ -n '' ]]

Upvotes: 2

Views: 176

Answers (1)

that other guy
that other guy

Reputation: 123470

set -e makes your script exit when any command returns failure.

(( 0 )), and equivalently elem=0; (( elem++ )) returns failure.

Therefore, the script exits.

If you set -e and want to run commands whose status you don't care, about, you can use

(( elem++ )) || true

Upvotes: 3

Related Questions