Você está passando \b$2\b para grep literalmente por causa das aspas simples. Para permitir que $2 se expanda para o valor do argumento, use "$2" . Além disso, citar entre backquotes pode ser complicado; use $(…) , que tem o mesmo significado que '…' (substituição de comando), mas se comporta bem com relação a citações.
if [ $(grep -c -e "\b$2\b" /etc/group) -eq 0 ]; then …
Em seguida, contar as correspondências é muito complicado: você pode usar o status de retorno de grep para saber se houve correspondências. Passe a opção -q para informar a grep que você não está interessado em nenhuma saída, apenas no status de retorno.
if ! grep -q -e "\b$2\b" /etc/group; then …
Em seguida, sua pesquisa está errada. Você está procurando a palavra $2 , mas isso pode corresponder a um nome de usuário ou a uma parte de um nome de grupo que contenha um caractere de pontuação ou a mais algumas diferenças exóticas. O nome do grupo é o primeiro campo delimitado por dois pontos, então pesquise por isso.
if ! grep -q -e "^$2:" /etc/group; then …
Observe que você pode precisar limpar a entrada: $2 não deve conter nenhum caractere especial para grep ou que seja um delimitador de grupo.
case $2 in
*[][\.*^$]*) echo "Unsupported character in the group name";;
esac
if ! grep -q -e "^$2:" /etc/group; then …
Por fim, grep /etc/group não é a ferramenta certa aqui, se você puder evitá-la. Você só pode encontrar nomes de grupos locais dessa maneira, não grupos vindos de NIS ou LDAP ou configurações incomuns. A maioria dos unices modernos (pelo menos Solaris, Linux e * BSD) tem um getent para recuperar entradas de bancos de dados do sistema, incluindo o banco de dados do grupo.
if ! getent group "$2" >/dev/null; then …
(para usuários, em vez de procurar em /etc/passwd , use getent passwd ou mais, de forma portável, chame id .)