Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 30/01/2013, à 00:51

Latsuj

Symbole de l'IFS

Bonsoir,

Voila plusieurs fois qu'en lisant des scripts, je tombe sur l'IFS, le fameux séparateur de champs. Je pensais avoir bien compris comment ce dernier fonctionnait. Mais sur certains code, je ne comprends pas. Par exemple, si j'ai un fichier texte de ce type :

ligne.txt :

aaa bbb ccc
ddd eee fff
ggg hhh iii

Si je fais ceci :

while IFS=$' ' read var1 var2 var3; do
echo $var1 $var2 $var3
done;

Il va bien renvoyé sur chaque variable les valeurs voulu, var1=aaa, var2=bbb, var3=ccc puis var1=ddd,...ext. Ici, pas de problème, j'ai défini que mon séparateur de champs n'était autre qu'un espace.

Mais...Si je fais ceci :

IFS=:
echo $(cat ligne.txt)

Il m'affiche le fichier telle que je l'ai présenté au départ. D'où ma question, à quoi fait allusion le ':' ? Qu'est ce que le shell comprend en lisant ce caractère ?

Merci d'avance et bonne soirée.

Hors ligne

#2 Le 30/01/2013, à 01:23

Maisondouf

Re : Symbole de l'IFS

ça va marcher mieux avec:

export ISF=:

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 30/01/2013, à 01:34

Watael

Re : Symbole de l'IFS

$ cat fichier 
cat:cot:cut
$ oIFS="$IFS"; IFS=':'; echo $(cat fichier ); IFS="$oIFS"
cat cot cut

Je ne suis pas sûr d'avoir compris ce que tu espérais obtenir.

Dernière modification par Watael (Le 30/01/2013, à 01:34)


eval, c'est mal.

Hors ligne

#4 Le 30/01/2013, à 01:34

Maisondouf

Re : Symbole de l'IFS

Si tu mets ça dans ton fichier de test:

aaa:bbb ccc qqq
ddd eee fff
ggg hhh iii

La boucle suivante ne va pas réagir de la même manière avec IFS='  '  et IFS=':'

for i in `echo $(cat ligne.txt)`; do echo $i ;done

Avec l'espace (export IFS=\ ), ça donne:

aaa:bbb
ccc
qqq
ddd
eee
fff
ggg
hhh
iii

avec ':' (export IFS=:), ça donne ça:

aaa bbb ccc qqq
ddd eee fff
ggg hhh iii

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#5 Le 30/01/2013, à 06:39

pingouinux

Re : Symbole de l'IFS

Bonjour,
Pour compléter ce qui a été dit, dans l'exemple du #1, avec IFS=:, c'est var1 qui contient la ligne complète.

$ while IFS=' ' read var1 var2 var3; do echo "=$var1=$var2=$var3="; done <ligne.txt
=aaa=bbb=ccc=
=ddd=eee=fff=
=ggg=hhh=iii=
$ while IFS=: read var1 var2 var3; do echo "=$var1=$var2=$var3="; done <ligne.txt
=aaa bbb ccc===
=ddd eee fff===
=ggg hhh iii===

En ligne

#6 Le 31/01/2013, à 02:55

Maisondouf

Re : Symbole de l'IFS

Trop fort, pingouinux....
Mais c'est quoi cet IFS, une variable globale d'environnement comme $PATH ou autre chose de spécial ?


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#7 Le 31/01/2013, à 07:24

pingouinux

Re : Symbole de l'IFS

@Maisondouf #6 :
IFS est une variable utiisée par le shell, au même titre que PATH. Voici un extrait de man bash :

IFS    The Internal Field Separator that is  used  for  word  splitting
              after  expansion  and  to  split  lines into words with the read
              builtin  command.   The  default  value  is  ``<space><tab><new‐
              line>''.

En ligne

#8 Le 01/02/2013, à 01:10

Maisondouf

Re : Symbole de l'IFS

OK, merci.
En plus il peut y avoir plusieurs caractères.... très intéressant...


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

Haut de page ↑