Por padrão, grep usa expressões regulares básicas (BRE). Dê uma olhada em qualquer recurso sobre o BRE (por exemplo, man grep e man regex ) para aprender a sintaxe. O $ em "$var" não está sendo passado para grep porque é especial para o shell. Se você tiver uma variável de shell chamada var , sua expansão é o que grep realmente vê. Se você não o fizer, então grep apenas recebe uma string vazia que combina com todos os lugares.
EDIT: A partir da especificação POSIX para BRE , os caracteres especiais são * , ^ , $ , . , [ , \
Se você quiser apenas combinar cadeias literais sem ter que se preocupar com quais caracteres têm um significado especial em BREs, você provavelmente deveria estar usando fgrep / grep -F (eles são a mesma coisa; ambos combinam cadeias fixas).