There are two problems here. First of all, what you are doing is absolutely the wrong way to process the files in a directory and will break if your file names contain newlines or other strangeness. See http://mywiki.wooledge.org/ParsingLs for more.
That said, the colors of
ls are optional. In many Linux distributions, the command
ls is actually aliased to
ls --color=tty which enables colors when
ls is printing to a tty (as opposed to a
while loop, for example). However, aliases are not enabled in scripts usually so when you run
ls from your script, you're just running normal
ls with no colors.
So, the first ugly workaround would be to call
ls --color=always. That will let you echo with colors. However, this is almost certainly a bad idea as I mentioned in the first paragraph. For one thing, if you just want to print each line out, why don't you just run
ls and forget the
If you do need to process the files for some other reason and still need to use
ls as well, use globbing to get the list of files and then run
ls on each of them manually:
for file in *; do
ls -d --color=always -- "$file"
That will not break on weird file names and will still show you the colors as you requested.