I tested on bash 4.3 and 3.0 testing]$ bash --version bash --version GNU bash, version 4.3.0(1)-release (x86_64-unknown-linux-gnu)
In a directory I have: testing]$ ls -l total 16 -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog1 -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog2 -rw-r--r-- 1 hpierce hpierce 77 Mar 26 20:09 dog3 -rw-r--r-- 1 hpierce hpierce 0 Mar 26 20:07 dog4 -rwxr-xr-x 1 hpierce hpierce 80 Mar 26 20:02 test dog1, dog2, and dog3 have content. dog4 is empty. test is a simple script: testing]$ cat test #!/bin/bash FILE=$1 echo $FILE if [ ! -e $FILE ] then echo "Usage: $0 <file>" exit 1 else echo $FILE exists fi Here's a regular run: testing]$ for f in *; do ./test $f; done dog1 dog1 exists dog2 dog2 exists dog3 dog3 exists dog4 dog4 exists test test exists Now I add a ls: testing]$ for f in `ls dog*`; do ./test $f; done dog1 Usage: ./test <file> dog2 Usage: ./test <file> dog3 Usage: ./test <file> dog4 Usage: ./test <file> So I moved it to an earlier version of bash testing]$ bash --version bash --version GNU bash, version 3.00.15(1)-release (x86_64-redhat-linux-gnu) testing]$ for f in `ls dog*`; do ./test $f; done dog1 dog1 exists dog2 dog2 exists dog3 dog3 exists dog4 dog4 exists