$ @ é um array não uma string, então o que você realmente quer fazer é usar um loop para iterar pelo array. Tente isto:
#!/bin/bash
for filename in "$@"; do
error=$(grep 'ERROR' "${filename}.l")
phone=$(grep 'phone' "${filename}.e")
invalid=$(grep 'invalid' "${filename}.l")
echo -e " Start of message \n :
$error \n
$invalid \n
$phone \n
End of message \n "
done
exit