An attempt at making a neat ls
If you use getopt or getopts to parse the options, you can use multiple options together, and it would simplify your code quite a bit. Example.
When you create arrays explicitly (name=(values)) you don't need to declare it first.
arrayContains should take one needle and then the contents of the array in question. This is how it works in other languages, and is easier to program and more explicit than using an array reference and concatenated needles. Also, when expanding needle the values will be concatenated with a space between them, which is rather arbitrary.
If needle is empty, arrayContains should return 0 regardless of the array contents.
You can merge the if statements in arrayContains by separating them with -o:

if [ $a -eq 0 -o $b -eq 0 -o $c -eq $a ]

ls works with globs rather than regular expressions by default. The find* functions will not return the same filenames as ls with the same input. For example, run touch example &amp;&amp; mkdir eclectic and compare

ls [e]*


with

find . -maxdepth 1 -depth -type f -regextype gnu-awk -regex "[e]*"

You should be able to get the current working directory with $PWD rather than pwd to save a fork. This makes the code a tiny bit faster, without losing clarity, and fixes a very common but little known bug: The `command` construct (identical to the preferred $(command) when using Bash) removes newlines from the end of the command output. That means if you mkdir $'foo\n' &amp;&amp; cd $'foo\n' , ORIGIN_DIR="`pwd`" will give the wrong result, but ORIGIN_DIR="$PWD" will give the right one.
Use More Quotes, for example do ARG="$1" to enable working with whitespace in filenames. This is a very tricky subject.
If you want to get this working with all filenames, you'll need to use an array to store the find results before sending them to ls