un peu en r�ponse � christophe qui trouve des $IFS partout ... ;-)
$IFS est le s�parateur de champ interne de bash
le s�parateur peut �tre un ou plusieurs caract�res dont les caract�res non imprimables.
quelques exemples:
$ IFS=$' \n\t' # le s�parateur par d�faut le plus commun. espace, saut de ligne ou
tabulation.
$ for i in 1:2:3:4:5 6; do echo $i; done
1:2:3:4:5
6
l'espace a servi de d�limiteur de champ
$ IFS=: # le s�parateur est ":"
$ for i in 1:2:3:4:5 6; do echo $i; done
1 2 3 4 5
6
les ":" ont �t� remplac� par des espaces mais toujours deux champs
$ for i in $(echo 1:2:3:4:5 6); do echo $i; done
1
2
3
4
5 6
les 5 champs d�limit�s par ":" sont pr�sents. le 5�me contient un espace qui n'a donc
pas �t� consid�r� comme d�limiteur de champ.
on peut aussi �muler un certain nombre de commandes:
$ IFS=$' \t\n'
$ echo 1:2:3:4:5 6 | cut -d : -f 5
5 6
$ IFS=:; emulcut=($(echo 1:2:3:4:5 6)); echo ${emulcut[4]}
5 6
cette commande �mule cut. le 5�me champ de cut (-f 5) est le 5�me champ de
${emulcut[*]}. le 1er �tant 0 -> le 5�me est donc 4
� noter qu'on peut trouver explicitement le dernier champ si on ne sait pas d'avance
combien il y en a
$ IFS=:; emulcut=($(echo 1:2:3:4:5 6)); echo ${emulcut[$((${#emulcat[*]}-1))]}
5 6
echo ${#emulcat[*]} renseigne sur le nombre de champs. �a a l'air barbare mais c'est
efficace :)
$ IFS=$' \t\n'
$ echo -e "1 2\n 3\t4\n\t5 6 7\n8" >test.txt
cr�e un fichier texte nomm� test.txt
$ cat test.txt
1 2
3 4
5 6 7
8
$ IFS=; emulcat=$(while read; echo $REPLY; done <test.txt); echo $emulcat
1 2
3 4
5 6 7
8
celle-ci �mule cat. � noter qu'on peut rediriger l'entr�e standard d'une boucle depuis
un fichier. read ne lit pas l'entr�e clavier mais le fichier.
$ IFS=$' \t\n'
$ wc -l <test.txt
4
$ head -n 1 test.txt
1 2
$ tail -1 test.txt
8
$ IFS=$'\n'
$ emul=($(while read; echo $REPLY; done <test.txt))
$ echo ${#emul[*]} # �mule wc -l
4
$ echo ${emul[0]} # �mule head -n 1
1 2
$ echo ${emul[$((${#emul[*]}-1))]} # �mule tail -1
8
on peut ici �muler �galement des pipes avec head et tail et se promener tranquillement
� l'int�rieur d'un fichier. le gros avantage est que si l'on veut travailler sur des
lignes d'un fichier, la d�finition de $emul remplit les champs une fois pour toute et
que l'on peut consulter ces divers champs sans consommer de ressource. alors qu'il
faudrait relancer un tail, un head ou un wc � chaque consultation diff�rente.
chacune des commandes ci-dessus est jusqu'� 10 fois plus rapide dans sa version bash.
il ne s'agit donc pas seulement de faire de belles lignes incompr�hensibles en "pure
bash", mais bien d'optimiser au maximum :)
la prochaine fois, j'explique comment marche mon script anti d�prime, � moins que
quelqu'un veuille s'y coller :)
bye
jipe
Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com"