Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1498 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Lire un fichier en Shell avec une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lire un fichier en Shell avec une boucle

n°2145310
Teklogix
Posté le 11-06-2012 à 10:36:49  profilanswer
 

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 !

mood
Publicité
Posté le 11-06-2012 à 10:36:49  profilanswer
 

n°2145314
likesum41
Posté le 11-06-2012 à 11:41:52  profilanswer
 

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.

n°2145395
dreameddea​th
Posté le 12-06-2012 à 00:04:19  profilanswer
 

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
 

n°2145511
Teklogix
Posté le 12-06-2012 à 14:38:44  profilanswer
 

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 !

n°2145514
likesum41
Posté le 12-06-2012 à 14:48:39  profilanswer
 

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

n°2145517
Teklogix
Posté le 12-06-2012 à 15:02:03  profilanswer
 

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 ? :)

n°2145519
likesum41
Posté le 12-06-2012 à 15:10:24  profilanswer
 

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

n°2145523
Teklogix
Posté le 12-06-2012 à 15:17:54  profilanswer
 

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 !

n°2145526
likesum41
Posté le 12-06-2012 à 15:22:37  profilanswer
 

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

n°2145528
Teklogix
Posté le 12-06-2012 à 15:38:53  profilanswer
 

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 ?
 
 

mood
Publicité
Posté le 12-06-2012 à 15:38:53  profilanswer
 

n°2145529
likesum41
Posté le 12-06-2012 à 15:45:39  profilanswer
 

La 1 et 3 devraient marcher, non?

n°2145531
Teklogix
Posté le 12-06-2012 à 15:49:04  profilanswer
 

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
n°2145534
likesum41
Posté le 12-06-2012 à 15:52:59  profilanswer
 

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

n°2145540
Teklogix
Posté le 12-06-2012 à 16:06:09  profilanswer
 

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 !

n°2145577
Teklogix
Posté le 12-06-2012 à 19:27:29  profilanswer
 

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.

n°2145581
spark
Luc ?
Posté le 12-06-2012 à 20:26:31  profilanswer
 

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


---------------
Un cycle complet sera une série de 100.
n°2145614
Profil sup​primé
Posté le 13-06-2012 à 02:06:24  answer
 

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.

n°2145630
likesum41
Posté le 13-06-2012 à 09:17:54  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Lire un fichier en Shell avec une boucle

 

Sujets relatifs
Comment lire un stdClass Objectlancer un programme via un fichier externe
Lire un fichier sur serveur FTP[BATCH] Recherche dans un fichier texte
modifier un fichier xmlInsérer fichier en xml sur une page en html
Chemin de fichier en variable[KSH] Comment tester si un fichier est complet ?
Fichier Excel "Eurofoot 2012" gratuit à télécharger 
Plus de sujets relatifs à : Lire un fichier en Shell avec une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR