Bob Marley is jamming on the wifi
Nothing would make a reviewer happier than help you jam the networks of an innocent neighborhood. (sarcasm)

Mutually exclusive conditions

Can line match Address, Channel, etc at the same time? If not, then the multiple [[ ... ]] are needlessly evaluated, and it would be better to rewrite them using elifs:

    if [[ "$line" =~ Address ]]; then
        m=${line##*ss: }
    elif [[ "$line" =~ Channel ]]; then
        chn=${line##*nel }
        chn=${chn:0:$((${#chn}-1))}
    elif
        ...


Avoid multiple statements on a single line

Multiple statements on a single line like this can be hard to read:


mac+=($m);essid+=($e);channel+=($chn);level+=($lvl)



It's better to split this line to have just one statement per line.
That way the code will be nicely readable from top to bottom,
without having to carefully read sideways too.

Conditions on non-empty values

A non-empty string is falsy in Bash,
so instead of [[ "$network" != "" ]] you can write:

[[ "$network" ]]


Simpler parameter expansion

An easier way to chop off the last letter of a string is using parameter expansion:

chn=${chn%?}


Function declaration style

Instead of this:


function scan {



The recommended style to declare functions is this:

scan() {