I believe that this is a problem with using shell quoting and spacing. The following code works better for me:
======================== g() { if [ -n "$2" ] then i= for s in $2 do if [ -n "$i" ] then i="$i --include=*.$s" else i="--include=*.$s" fi done else i='--include=*.txt --include=*.ini --include=*.*sh --include=*.c* --include=*.h --include=*.js --include=*.reg' fi grep -P -e "$1" -r $i } ======================== The two changes I made: 1) Avoid putting a space at the front of the first "--include=*.$s" argument. 2) Double quote, not escaped single quote, the "$1" parameter to grep. The parameter " --include=*.ini" was not a valid "--include" argument to grep; rather it looked like a filename to grep, as its first character was a space. The escaped single quotes around the "$1" parameter meant that you were not looking for the three character pattern "sys", but rather for the five character pattern "'sys'" (which is less likely to have appeared in your test data.) -- Paul Jackson p...@usa.net