Lire un fichier en Shell avec une boucle

Lire un fichier en Shell avec une boucle - Shell/Batch - Programmation

Marsh Posté le 11-06-2012 à 10:36:49    

Bonjour à tous !
 
Voila j'ai créé un serveur pure-ftpd sous ubuntu. J'ai créé un script pour automatiser un peu la création d'un compte.
 

Code :
  1. chmod 744 creation_utilisateur_non_restreint.sh
  2. ./creation_utilisateur_non_restreint.sh
  3. echo -----CREATION UTILISATEUR NON RESTREINT-----
  4. echo ---NOM ?---
  5. read nom
  6. echo Désirez-vous créer un dossier HomeDirectory pour cette utilisateur?
  7. echo oui/non :
  8. read reponse
  9. If ( ( " $reponse " = " oui " ) ) ; Then
  10.     mkdir /var/transfert_ftp/$nom
  11.     pure-pw useradd $nom -u utilisateur_ftp -g groupe_ftp -d /var/transfert_ftp/$nom
  12.     pure-pw mkdb
  13.   Else
  14.     pure-pw useradd $nom -u utilisateur_ftp -g groupe_ftp -d /var/transfert_ftp
  15.     pure-pw mkdb
  16. Fi


 
Maintenant j'aimerai l'automatiser avec une boucle for qui lit dans un fichier les comptes utilisateurs. J'ai cherché un peu partout, mais je dois dire que j'ai un peu de mal avec les boucles for. Quelqu'un connait la syntaxe pour importer à partir d'un fichier ? Comment devra se présenter mon fichier ?
 
Je vous remercie de votre aide !

Reply

Marsh Posté le 11-06-2012 à 10:36:49   

Reply

Marsh Posté le 11-06-2012 à 11:41:52    

while read line  
 
compte=$line
#traitement de la ligne
 
done < fichier
 
 
Bonjour, pourquoi pas ceci?
Je pense que le FOR n'est pas adapté pour parcourir un fichier. Sinon il y aurait la commande AWK que je ne maîtrise pas.

Reply

Marsh Posté le 12-06-2012 à 00:04:19    

En théorie qq chose du style doit marcher :

Code :
  1. for nom_user in `cat [le nom du fichier]`
  2. do
  3.      echo "$nom_user\noui\n" | [le script];
  4. done;


 
Mais l'idéal est de mettre dans le script un paramètre (nom=$1 et reponse=$2) plutôt qu'un read nom/read reponse
 
A bientôt
 

Reply

Marsh Posté le 12-06-2012 à 14:38:44    

Merci pour votre aide.
 
Alors je précise un peu plus ce que je recherche. J'ai un fichier avec un seul mot dans chaque ligne, j'aimerai dire par exemple:
 
$nom=toto
Tant que $toto=$ligne faire
commande
commande
commande
Fin tant que
 
Je sais pas si c'est clair. Encore un autre problème, ça serait de dire:
Tant que $toto ou $tata ou $tutu = $ligne, je peux utiliser: $toto || $tata || $tutu = $ligne ???
 
Merci encore pour votre aide !

Reply

Marsh Posté le 12-06-2012 à 14:48:39    

nom=$toto
while read line  
  if [ "$line" = "$toto" ]
    break
  fi
  commande
  commande
  commande
done < fichier
 
Pour ta deuxième solution, c'est plus:
 
while [ [ "$toto" = "$line" ] || [ "$tata" = "$line" ] || [ "$tutu" = "$line" ] ]  
do
done

Reply

Marsh Posté le 12-06-2012 à 15:02:03    

Merci pour ton aide:
 
J'ai donc pour testé fait:
 

Code :
  1. #!/bin/bash
  2. #Mise a jour des blacklists
  3. cd /var/lib/squidguard/db
  4. ls > /list.txt
  5. charle=$toto
  6. while read line
  7.         if ["$line" ="$toto"]
  8. break
  9.         fi
  10. echo "mise a jour de charles" > test.txt
  11. done < fichier


 
Cela dit quand je lance le bash avec +x il m'indique:
 

Code :
  1. majftp.sh: line 9: syntax error near unexpected token `fi'
  2. majftp.sh: line 9: `fi'


 
Tu as une petite idée ? :)

Reply

Marsh Posté le 12-06-2012 à 15:10:24    

Je crois que Bash est assez stricte avec les espaces dans les crochets de tests. Et j'ai oublié le "then"
 
Met bien:
if [ "$line" = "$toto" ]
then
break
fi

Reply

Marsh Posté le 12-06-2012 à 15:17:54    

Super ça avance !
 
Maintenant il ne me reste plus que ça comme erreur d'exécution:
 

Code :
  1. majftp.sh: line 12: syntax error near unexpected token `done'
  2. majftp.sh: line 12: `done < fichier'


 
Une fois ceci fait après je pense ne plus avoir de problème, je te remercie encore pour ta précieuse aide !

Reply

Marsh Posté le 12-06-2012 à 15:22:37    

tu remplaces fichier de la ligne 12 par le fichier ou se trouvent tous tes noms de compte.
 
Et normalement, ... ;)

Reply

Marsh Posté le 12-06-2012 à 15:38:53    

mmmh alors voila ce que j'ai:
 

Code :
  1. #!/bin/bash
  2. charles=$toto
  3. while read line
  4.         if [ "$line" ="$toto" ]
  5. then
  6. break
  7. fi
  8. echo "mise a jour de charles" > test.txt
  9. done < /list.txt


 
J'ai essayé:  

Code :
  1. done < /list.txt
  2. done < list.txt
  3. done < "/list.txt"
  4. done < "list.txt"
  5. done << /list.txt


 
Il se trouve à la racine, donc dans /
 
Peut être l'extension du fichier .txt ?
 
 

Reply

Marsh Posté le 12-06-2012 à 15:38:53   

Reply

Marsh Posté le 12-06-2012 à 15:45:39    

La 1 et 3 devraient marcher, non?

Reply

Marsh Posté le 12-06-2012 à 15:49:04    

likesum41 a écrit :

La 1 et 3 devraient marcher, non?


 
J'ai le même message d'erreur :
 

Code :
  1. majftp.sh: line 12: syntax error near unexpected token `done'
  2. majftp.sh: line 12: `done < /list.txt'


Message édité par Teklogix le 12-06-2012 à 15:49:15
Reply

Marsh Posté le 12-06-2012 à 15:52:59    

décidément je suis pas dans mon assiette, ajoute:
do
juste après la ligne du while
 
 
while read line
do
        if [ "$line" ="$toto" ]
then
break
fi

Reply

Marsh Posté le 12-06-2012 à 16:06:09    

Ca marche nettement mieux ! Je te remercie, je vais travailler sur cette base grâce à toi, j'espère pouvoir m'en tirer tout seul maintenant :)
 
Encore merci !

Reply

Marsh Posté le 12-06-2012 à 19:27:29    

Je galère sur quelque chose: l'endroit où l'on met les commandes.
 
Si je les met après le fi comme tu me l'a dis, il me fait la commande X fois en fonction du nombre X de ligne que j'ai dans mon fichier.
Si je les met après le then rien ne fonctionne.
Si je les met avant le then rien ne fonctionne.
Si je les met après done < fichier ça fonctionne mais ça applique pas la condition.
 
La je suis un peu perdu, c'est pas du tout la même structure if / while / for qu'en batch.

Reply

Marsh Posté le 12-06-2012 à 20:26:31    

cat pwet.txt | while read line  
do
 
  echo "$line"
 
done


---------------
Un cycle complet sera une série de 100.
Reply

Marsh Posté le 13-06-2012 à 02:06:24    

salut,
 
Y a-t-il un codeur sur ce sujet ?
 
si tu veux lire le contenu d'un fichier

Code :
  1. nomFichier=monfichier.txt
  2. while read -r line
  3. do
  4.    echo "$line"
  5. done < "$nomFichier"


si tu veux lire le contenu d'un répertoire, en bash

Code :
  1. repertoire=monrepertoireamoi
  2. shopt -s nullglob
  3. for f in "$repertoire"/*
  4. do
  5.    echo "$f"
  6. done

c'est tout simple.
 
ce serait bien de préciser l'algorithme que tu as l'intention de coder : dessine un arbre de décision.

Reply

Marsh Posté le 13-06-2012 à 09:17:54    

SI tu veux qu'il effectue ta commande qu'une fois dans le cas ou il a trouvé un doublon de ta variable dans le fichier, c'est quelque chose du genre:
 
#!/bin/bash
    trouve="false"
    charles=$toto
    while read line
            if [ "$line" = "$toto" ]
            then
            trouve="true"
            break
            fi
    echo "mise a jour de charles" > test.txt
    done < /list.txt
    if [ "$trouve" = "true" ]
    then
            commande
    fi

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed