The environment variable $LINENO contains the current line number of the running BASH shell. On the command line the value will be the number of command line prompts you've used in that shell, but in a script it's the currently executing line -- and it really is line number, if you loop over the same lines it will continue to print the same line number.

#!/bin/bash

echo $0 $LINENO: 3

for I in one two three; do  
    echo $0 $LINENO: $I in loop
done

echo $0 $LINENO: 9, on same line; echo $0 $LINENO: 9, on same line

( echo $0 $LINENO: 11, in subshell ) 

function f {  
    echo $0 $LINENO: 14, function
}

f  

This example script will produce the following output:

./lineno.sh 3: 3
./lineno.sh 6: one in loop
./lineno.sh 6: two in loop
./lineno.sh 6: three in loop
./lineno.sh 9: 9, on same line
./lineno.sh 9: 9, on same line
./lineno.sh 11: 11, in subshell
./lineno.sh 14: 14, function

Useful for more fine tuned debugging (instead of something like bash -x), or giving context to error messages.