Kurrt a écrit :
Voila, le but du script est de recuperer le contenu du fichier passwd et d'en extraire les informations de base (Nom,Groupe,Repertoire d'accueil et Shell).
|
Pas de pb - Exercice de base dans l'apprentissage du shell
Kurrt a écrit :
Le probleme qui se pose a moi est que la fonction read copie le contenu entier de chaque ligne retournée par la boucle for dans la variable $name. Et non dans chacune des variables définies.
|
Comprends rien à ce que tu dis. La fonction "read" (comme dans la syntaxe "read a b c" ) découpe toute ton entrée selon le shéma "a b c" en fonction de l'IFS
- le premier mot va dans "a"
- le second mot va dans "b"
- le reste de la ligne (du 3° mot jusqu'au "return" ) va dans "c"
Kurrt a écrit :
J'ai pu remarquer que la modification de la variable IFS modifiait le contenu du fichier temporaire que je crée pour stocker les lignes retournées par la boucle for.
|
Absolument pas. Tu as pu être trompé par le fait que l'IFS n'est jamais affichable. Donc si tu fais un "echo" dans ton script, partout où il y aura ":" tu verras un espace mais si tu fais "cat tmp" en dehors du script, tu verras tes ":" bien présent.
Kurrt a écrit :
Quand elle est modifiée en : dans la boucle pour permettre a read d'avoir ce délimiteur de champ précis, on trouve la ligne initiale ou tous les : sont remplacés par des <espaces>.
|
Pourquoi faire simple quand on peut faire compliqué.
Déjà on peut se passer du fichier tmp qui implique
- un accès disque donc lent
- un accès concurrent (que se passe-t-il si tu lances 2 fois le même script en parallèle ? => les deux scripts vont se polluer mutuellement via le fichier "tmp" )
Pas étonnant - Toucher à l'IFS est très dangereux car tout le shell utilise ce séparateur et on se retrouve souvent avec des résultats incohérents voire inexpliquables. Donc si on y touche, autant le faire "bien" et de façon très limitée (on le remet immédiatement après s'en être servi et non en fin de script).
#!/bin/bash
old=$IFS
echo "Nom Groupe Repertoire Shell"
echo "---------------------------------------"
cat passwd.cpy |while read ligne
do
IFS=:
set $ligne
IFS=$old
echo $1 $4 $6 $7
done |
La structure "cat ... |while read" est une astuce liée au fait que "read" arrête sa lecture à chaque "return" donc à chaque boucle, la variable "ligne" contiendra toute la ligne venue du pipe lui même alimenté par le fichier. Ensuite il n'y a plus qu'à la découper proprement sur le séparateur ":"
On peut éviter le pipe en utilisant "exec" qui te crée un autre canal input ou output selon le cas
#!/bin/bash
old=$IFS
echo "Nom Groupe Repertoire Shell"
echo "---------------------------------------"
exec 3<passwd.cpy
while read ligne 0<&3
do
IFS=:
set $ligne
IFS=$old
echo $1 $4 $6 $7
done |
Message édité par Sve@r le 14-11-2006 à 17:09:39
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.