Plusieurs remarques :
1. tout d'abord la premiere ligne c'est "#!/bin/bash" (tu devrais utiliser bash au lieu de sh - non ca n'est pas pareil) et pas "#! /bin/bash". Il n'y a pas d'espace. Si quelqu'un t'a dit qu'il y en avait un, il s'est lourdement trompe car la norme POSIX est
contre cette pratique.
2. Tes parentheses n'ont aucun interet. Tu peux les enlever
echo $login | (adduser $login -s /sbin/nologin -g mail)>/dev/null
3. adduser ne prend rien sur l'entree standard, que je sache, tu peux retirer le "echo $login".
4. Les erreurs ne sont pas affichees sur la sortie standard mais sur l'erreur standard. '>' (ou '1>') redirige la sortie standard. '2>' redirige l'erreur standard.
5. Si tu ton mot de passe contient des caracteres non-alphanumeriques, ton script peut planter. Prend l'habitude de referencer tes variables avec double quote autour : "$login" au lieu de "$login", "$?" au lieu de $?, "$pass" au lieu de $pass.
6. Enfin d'un point de vue fonctionnel, pourquoi ne pas simplement faire ceci ?
echo "Entrez le mot de passe de $login"
passwd "$login"
Ton "read pass" affichera le mot de passe a l'ecran, ce qui n'est pas tres securise. Cette solution est a preferee a la tienne.
Pour plus d'info sur la syntaxe : man bash. Pour le reste, prend toi un bon manuel de programmation shell script.