Le 03/12/06, Bernard Siaud a écrit :

> >> [EMAIL PROTECTED] ~]$ echo $var
> >> 4618 4619 4620 4622 4623 4626 4627 4628 4629 4630 4631 4632 4633
> >> 4635 4636 4637 4640 4641 4645 4649 4652 4655 4656 4657 4659 4660
> >> 4661 4662 4663 4664 4666 4671 4672 4679 4686 4688 4690 4691 4692
> >> 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4707 4710 4711
> >> 4712 4713 4714 4715 4716 4718 4719 
> >> [EMAIL PROTECTED] ~]$ set -- {4618..4719}; for arg; do
> >> [[ $var =~ "\b$arg\b" ]] || printf "%d " $arg; done; echo 
> >> 4621 4624
> >> 4625 4634 4638 4639 4642 4643 4644 4646 4647 4648 4650 4651 4653
> >> 4654 4658 4665 4667 4668 4669 4670 4673 4674 4675 4676 4677 4678
> >> 4680 4681 4682 4683 4684 4685 4687 4689 4693 4694 4705 4706 4708
> >> 4709 4717 

> OK ! Sauf que je n'ai rien compris :(

La variable var contient une liste de nombress dans l'ordre croissant.
On cherche les nombres qui n'y apparaissent pas, compris entre les
bornes de la liste.

set -- {4618..4719}
a pour effet de donner la valeur 4618, 4619, 4620 etc, jusqu'à 4719 aux
arguments positionnels : $1, $2, $3 etc. Autrement dit tous les nombres
dont il faut tester l'appartenance à la liste.

Le "for arg;" prend alors ces arguments positionnels un par un. Qu'en
fait-il ? Si le résultat du test [[ $var =~ "\b$arg\b" ]] est faux, il
écrit la valeur de arg sur la sortie standard. Le test, quant à
lui, vérifie si var correspond (=~) à l'expression régulière \b$arg\b,
sachant que \b est la marque pour "le bord" d'un mot. Il vérifie donc
si la valeur de arg apparaît dans la liste des numéros var.

Écrivant cela, je me dis qu'on aurait pu écrire aussi :

for arg in $(seq 4618 4719); do
    [[ $var =~ "\b$arg\b" ]] || printf "%d " $arg
done

Encore que Jipe va sûrement nous expliquer en quoi c'est moins bien ;-)

-- 
Christophe
http://ch4tn01r.free.fr/blog

=========================================
Vous souhaitez acquerir votre pack ou des services Mandriva?
Rendez-vous sur "http://store.mandriva.com";.
Rejoignez le club Mandriva : http://club.mandriva.com
=========================================

Répondre à