2

The following for loop in bash gives an error -

line 42: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")

line 42 is statement - num1=$[$i1 + 1]

for i1 in `seq 1 5`
    do
    num1=$[$i1 + 1]
        for k1 in `seq $num1 5`
        do
        ky1="${team_two[i1]}_${team_two[k1]}"
        pair_score[$ky1]=$[${pair_score[$ky1]}+1]
        done
    done

What is wrong with the code?

EDIT

I get the following output on debugging

++ seq 1 5
+ for i1 in '`seq 1 5`'
/home/ashwin/bin/calculate_power: line 43: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")

Again it is the same statement that line 43 - num1=$[$i+1]

0

2 Answers 2

4

Seems like you have some problems with your ${team_two[*]} & ${team_two[k1]} arrays or you've messed with the separation characters in the special variable $IFS. You can turn the Bash debugging on by adding a set -x before you enter the outer for loop. And then disable it afterwards with a set +x, to gain further insights.

set -x
... for loop block ...
set +x

Example

When I run your code through Bash in this manner I get the following output:

$ bash -x for.bash 
++ seq 1 5
+ for i1 in '`seq 1 5`'
+ num1=2
++ seq 2 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=1
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=2
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=3
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=4
+ for i1 in '`seq 1 5`'
+ num1=3
++ seq 3 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=6
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=7
+ for i1 in '`seq 1 5`'
+ num1=4
++ seq 4 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=8
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=9
+ for i1 in '`seq 1 5`'
+ num1=5
++ seq 5 5
+ for k1 in '`seq $num1 5`'
+ ky1=_
+ pair_score[$ky1]=10
+ for i1 in '`seq 1 5`'
+ num1=6
++ seq 6 5

Edit #1

After further updates it would appear you've reset $IFS. Typically you'll want to save $IFS to an secondary variable prior to reseting it, and the revert it later on back to it's original value.

IFSOLD=$IFS
IFS=,

... do IFS , stuff here ...

IFS=$IFSOLD

IFS

If you try these examples they might help shed additional light on to the impact $IFS can play when used within a script.

Say I have the following variable:

$ var="1,2,3,4,5"

Now let's parse it and print the first variable, $c1:

$ IFS=',' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1

However if we changed our $IFS to a space.

$ IFS=' ' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1,2,3,4,5

So in the second example, we've configured the read command via $IFS to split on spaces, rather than commas.

8
  • I did the debugging as you told. I have edited the question with the output.
    – Ashwin
    Apr 17, 2014 at 8:29
  • If the problem was with the arrays then echo "$num1" should atleast have worked. But even that doesn't work
    – Ashwin
    Apr 17, 2014 at 8:37
  • @Ashwin - what version of Bash is this? It looks as if it's trying to add all the elements. 1 2 3 4 5 + 1.
    – slm
    Apr 17, 2014 at 13:23
  • Bash version - 4.2.45(1)
    – Ashwin
    Apr 17, 2014 at 15:29
  • @Ashwin see updates.
    – slm
    Apr 17, 2014 at 17:46
3

Nothing (fundamentally) wrong with that code, your problem is you've reset "IFS" somewhere else, it's probably empty (so the output of seq is treated as a single token).

Long time since I've seen $[], it's obsolete (and undocumented). Use $(( )).

Instead of seq use for (( )), and instead of adding 1, use let var++, so we have:

for (( i1=1 ; i1<=5; i1++))
    do
        for ((k1=i1+1; k1<=5; k1++))
            do
                ky1="${team_two[i1]}_${team_two[k1]}"
                let pair_score[$ky1]++
            done
    done    

Since you're using a recent bash with associative arrays, may as well use the other nice features too :-)

1
  • you are right about the IFS part. I have set the "IFS=,". That was done because I wanted to split a string into an array separated by comma. What does that have to do with for loop seq? How can I correct it?
    – Ashwin
    Apr 17, 2014 at 15:38

Not the answer you're looking for? Browse other questions tagged .