2011-03-15 2 views
1

Mon problème est d'ajouter un nom d'utilisateur à un fichier, j'ai vraiment bloqué pour continuer, s'il vous plaît aider. Problème: J'ai un fichier appelé usrgrp.dat. Le format de ce fichier est comme:Trouver et ajouter un mot à une ligne particulière en utilisant un script shell avec le format exact d'un fichier

ADMIN:srikanth,admin 
DEV:dev1 
TEST:test1 

Je suis en train d'écrire un script shell qui devrait me donner la sortie comme:

Enter group name: DEV 
Enter the username: dev2 

Mon résultat attendu est:

User added to Group DEV 

Si je vois le contenu de usrgrp.dat, il devrait maintenant ressembler à:

DEV:dev1,dev2 
TEST:test1 

Et il devrait me donner une erreur en disant user already present si j'essaye d'ajouter l'utilisateur déjà existant dans ce groupe. J'essaye ceci dehors avec le manuscrit suivant:

#!/bin/sh 
dispgrp() 
{ 
     groupf="/home/srikanth/scm/auths/group.dat" 
     for gname in `cat $groupf | cut -f1 -d:` 
     do 
       echo $gname 
     done 
     echo "Enter the group name:" 
     read grname 
     for gname in `cat $groupf | cut -f1 -d:` 
     do 
       if [ "$grname" = "$gname" ] 
       then 
         echo "Enter the username to be added" 
         read uname 
         for grname in `cat $groupf` 
         do 

           $gname="$gname:$uname" 
           exit 1 
         done 
       fi 
     done 
} 
echo "Group display" 
dispgrp 

Je suis bloqué et ai besoin de votre aide valable.

Répondre

1
#!/bin/sh 
dispgrp() 
{ 
     groupf="/home/srikanth/scm/auths/group.dat" 
     tmpfile="/path/to/tmpfile" 
     # you may want to pipe this to more or less if the list may be long 
     cat "$groupf" | cut -f1 -d: 
     echo "Enter the group name:" 
     read grname 
     if grep "$grname" "$groupf" >/dev/null 2>&1 
     then 
      echo "Enter the username to be added" 
      read uname 
      if ! grep "^$grname:.*\<$uname\>" "$groupf" >/dev/null 2>&1 
      then 
       sed "/^$grname:/s/\$/,$uname/" "$groupf" > "$tmpfile" && mv "$tmpfile" "$groupf" 
      else 
       echo "User $uname already exists in group $grname" 
       return 1 
      fi 
     else 
      echo "Group not found" 
      return 1 
     fi 
} 
echo "Group display" 
dispgrp 

Vous n'avez pas besoin d'utiliser des boucles lorsque les boucles sont faites pour vous (par exemple cat, sed et grep). N'utilisez pas for pour parcourir la sortie cat. N'utilisez pas exit pour revenir d'une fonction.

Utilisez return.

Un code de sortie ou de retour différent de zéro indique une erreur ou un échec. Utilisez 0 pour un retour normal et réussi. C'est l'action implicite si vous n'en spécifiez pas. Apprenez à utiliser sed et grep.

Depuis que votre shebang dit #!/bin/sh, les modifications que j'ai apportées ci-dessus sont basées sur le shell Bourne et supposent des utilitaires POSIX (pas des versions GNU).

+0

merci pour votre précieuse suggestion, j'ai essayé à la fois la vôtre et la solution de Glenn. Lorsque j'ai essayé d'exécuter le script comme suggéré par vous, il se bloque après avoir accepté un nom d'utilisateur. – Srikanth

+0

@Srikanth: Désolé, j'ai eu quelques erreurs qui sont maintenant corrigées. –

+0

Nous vous remercions de votre aide précieuse. Il a été réparé. – Srikanth

1

Quelque chose comme (supposons que votre shell est bash):

adduser() { 
    local grp="$1" 
    local user="$2" 
    local gfile="$3" 

    if ! grep -q "^$grp:" "$gfile"; then 
     echo "no such group: $grp" 
     return 1 
    fi 

    if grep -q "^$grp:.*\\<$user\\>" "$gfile"; then 
     echo "User $user already in group $grp" 
    else 
     sed -i "/^$grp:/s/\$/,$user/" "$gfile" 
     echo "User $user added to group $grp" 
    fi 
} 

read -p "Enter the group name: " grp 
read -p "Enter the username to be added: " user 
adduser "$grp" "$user" /home/srikanth/scm/auths/group.dat 
+0

Merci pour l'aide. Cela fonctionne comme prévu. – Srikanth

Questions connexes