On Sun, 8 Dec 2002 05:10:00 +0100
nono <[EMAIL PROTECTED]> wrote:

> Why not !!!

oki :)

le script:
#######################################################################
#!/bin/bash
#bacon
#jipe-2002

help ()
{
echo " #################+Aide+Pour+Bacon+#################"
echo " # � l'invite > entrer un nombre et une base       #"
echo " # - exemples: > 1954 2 ou > 2#1011001 8           #"
echo " # format du nombre: base#nombre                   #"
echo " # cas particuliers:                               #"
echo " # - base 8: 8#nombre ou 0nombre                   #"
echo " # - base 10: 10#nombre ou nombre                  #"
echo " # - base 16: 16#nombre ou 0xnombre                #"
echo " # nombres accept�s: entiers positifs              #"
echo " # - les nombres doivent �tre valides pour la base #"
echo " # - 2#1201 ou 8#2581 sont invalides               #"
echo " # bases accept�es: de 2 � 64                      #"
echo " # pour sortir taper exit                          #"
echo " ###################################################"
}

c=0
for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C 
D E F G H I J K L M N O P Q R S T U V W X Y Z _ @
        do
                eval d$c=$i
                ((c++))
        done

while true
        do
                e=
                echo -n "> "
                read a b; if ((b)) 2>/dev/null; then :; else b=0; fi
                if [ $a = exit ] 2>/dev/null; then break; fi
                if [ $a = aide ] 2>/dev/null; then help; continue; fi
                if [ $b -lt 2 -o $b -gt 64 ] 2>/dev/null; then echo "mauvais 
param�tres: taper aide"; continue; fi
                if [ $a = 0 ] 2>/dev/null; then e=0; fi
                if ((0<$a && $a<=2147483647)) 2>/dev/null
                        then a=$((a)); until [ $a = 0 ]; do d=$((a%b)); eval d=\$d$d; 
e=$d$e; a=$((a/b)); done
                        else if [ $a != 0 ] 2>/dev/null; then echo "mauvais 
param�tres: taper aide"; continue; fi
                fi
                case $b in 8) b=0 ;; 10) b= ;; 16) b=0x ;; *) b="$b#" ;; esac
                echo "$b$e"
        done
exit 0
########################################################################

la 1�re partie:

#!/bin/bash
#bacon
#jipe-2002

c'est donc un script bash qui de plus n'utilise que des commandes internes de bash :P
il s'appelle bacon parce que base converter re :P
et c'est moi que je l'ai fait avec mes grosses mains velues en 2002 ...

la 2�me partie:

help ()
{
echo " #################+Aide+Pour+Bacon+#################"
echo " # � l'invite > entrer un nombre et une base       #"
echo " # - exemples: > 1954 2 ou > 2#1011001 8           #"
echo " # format du nombre: base#nombre                   #"
echo " # cas particuliers:                               #"
echo " # - base 8: 8#nombre ou 0nombre                   #"
echo " # - base 10: 10#nombre ou nombre                  #"
echo " # - base 16: 16#nombre ou 0xnombre                #"
echo " # nombres accept�s: entiers positifs              #"
echo " # - les nombres doivent �tre valides pour la base #"
echo " # - 2#1201 ou 8#2581 sont invalides               #"
echo " # bases accept�es: de 2 � 64                      #"
echo " # pour sortir taper exit                          #"
echo " ###################################################"
}

d�claration de la fonction help qui servira � afficher un message d'aide dans les 
conditions d�finies plus tard. la structure d'une fonctions est
fonction () { commandes }
elle est interne au script et s'appelle simplement par son nom.

la 3�me partie:

c=0
for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C 
D E F G H I J K L M N O P Q R S T U V W X Y Z _ @
        do
                eval d$c=$i
                ((c++))
        done

les bases sup�rieures � 10 utilisent des caract�res autres que des chiffres pour tous 
les chiffres sup�rieurs � 9. il faut donc donner une correspondance. les caract�res 
utilis�s sont 10 chiffres, 26 minuscules, 26 majuscules, _ et @. ce qui fait 
10+26+26+1+1=64. on peut donc aller jusqu'� la base 64.
la correspondance se fait ainsi: les caract�res de 0 � @ vont �tre affect�s comme 
valeur des variables de d0 � d63 grace � une boucle for et un appel indirect grace � 
eval.
eval va permettre d'affecter la valeur $i (de 0 � @) � d$c (de d0 � d63).
$c est incr�ment� de 1 � chaque boucle avec ((c++)) qui est une autre mani�re d'�crire 
c=$((c+1)) ou let c+=1 ou etc... 

la 4�me partie

while true
        do
                e=
                echo -n "> "
                read a b; if ((b)) 2>/dev/null; then b=$((b)); else b=0; fi
                if [ $a = exit ] 2>/dev/null; then break; fi
                if [ $a = aide ] 2>/dev/null; then help; continue; fi
                if [ $b -lt 2 -o $b -gt 64 ] 2>/dev/null; then echo "mauvais 
param�tres: taper aide"; continue; fi
                if [ $a = 0 ] 2>/dev/null; then e=0; fi
                if ((0<$a && $a<=2147483647)) 2>/dev/null
                        then a=$((a)); until [ $a = 0 ]; do d=$((a%b)); eval d=\$d$d; 
e=$d$e; a=$((a/b)); done
                        else if [ $a != 0 ] 2>/dev/null; then echo "mauvais 
param�tres: taper aide"; continue; fi
                fi
                case $b in 8) b=0 ;; 10) b= ;; 16) b=0x ;; *) b="$b#" ;; esac
                echo "$b$e"
        done

une boucle while avec true comme condition puis:

e= 
$e est d�finie mais n'a pas de valeur affect�e. elle sera compl�t�e ensuite.

echo -n ">"
une invite > s'affiche pour taper � la suite (option -n de echo) les param�tres � 
analyser. cad le nombre et la base. (NB: le script est int�ractif)

read a b; if ((b)) 2>/dev/null; then b=$((b)); else b=0; fi
read a b permet de distinguer les 2 param�tres s�par�s par un espace et ainsi 
d'attribuer une valeur � $a et $b. read sans rien derri�re aurait attribu� � $REPLY 
(variable interne) l'ensemble de la saisie clavier, espace compris. 
la condition suivante if ((b)) permet de v�rifier si $b est bien un entier diff�rent 
de 0 auquel cas $b garde sa valeur �ventuellement ramen�e en base dix au cas o� on ait 
l'id�e saugrenue de l'exprimer dans une autre valeur. sinon la valeur 0 est affect�e � 
$b.
<appart�> 
echo $((nombre)) renvoie la valeur en base dix de tout nombre correctement exprim� 
dans toute base de 2 � 64. pour �tre valide, ce nombre doit �tre compos� comme suit: 
base#nombre. base est un nombre de 2 � 64 exprim� en base dix et nombre doit utiliser 
les caract�res valides pour la base. les cas particuliers sont:
- base 8: 8#nombre ou 0nombre
- base 10: 10#nombre ou nombre
- base 16: 16#nombre ou 0xnombre ou 0Xnombre
dans les bases inf�rieures � 37 (10 caract�res num�riques et 26 caract�res 
alphab�tiques) la casse est indiff�rente. il n'en est plus de m�me ensuite.
echo $((36#a)) et echo $((36#A)) renvoient 10
echo $((37#a)) renvoie 10 et echo $((37#A)) renvoie 36
</appart�>

if [ $a = exit ] 2>/dev/null; then break; fi
if [ $a = aide ] 2>/dev/null; then help; continue; fi
2 conditions qui permettent de rechercher 2 valeurs particuli�res de $a et d'executer 
les actions qui en d�coulent.
si $a = exit, on sort de la boucle while grace � break et le script se termine
si $a = aide, on affiche le message d'aide grace � help puis on recommence au d�but de 
la boucle grace � continue et on se retrouve avec une nouvelle invite >. 

if [ $b -lt 2 -o $b -gt 64 ] 2>/dev/null; then echo "mauvais param�tres: taper aide"; 
continue; fi
double condition avec "ou" (-o). on peut coupler les conditions de diff�rentes 
mani�res. dans les [] ou [[]] avec -o (ou) et -a (et) ou avec || (ou) et && (et) � 
l'ext�rieur des crochets. ici la condition coupl�e est la suivante:
si $b est plus petit que 2 ou si $b est plus grand que 64, un message d'erreur est 
affich� et on recommence au d�but de la boucle (continue).

if [ $a = 0 ] 2>/dev/null; then e=0; fi
cette condition permet de donner la valeur 0 � $e au cas o� on voudrait savoir comment 
s'�crit 0 dans une base quelconque :)

if ((0<$a && $a<=2147483647)) 2>/dev/null
une condition double exprim�e entre doubles parenth�ses. les diff�rents �lements ne 
doivent �tre que des entiers. les $ de $a ne sont pas n�cessaires. la double condition:
si $a est strictement sup�rieure � 0 et inf�rieure ou �gale � 2147483647
ce dernier chiffre est la limite sup�rieure pour les calculs arithm�tiques dans bash. 
<appart�>
la construction (()) permet d'�crire des conditions et leurs actions qui en d�coulent 
de fa�on tr�s concise � condition de n'utiliser que des valeurs enti�res pour les 
variables.
((a=b%2==0?0:1));echo $a 
renvoie 0 si $b est paire et 1 si $b est impaire.
elle se d�compose ainsi:
((a= b%2==0? 0:1))
et se lit ainsi:
a= 
$a sera �gale �
b%2==0? condition
si $b modulo 2 �gal 0 cad si le reste de $b divis� par 2 est 0
0:1 valeurs de $a
0 si vrai et 1 si faux
</appart�>

then a=$((a)); until [ $a = 0 ]; do d=$((a%b)); eval d=\$d$d; e=$d$e; a=$((a/b)); done
si la condition pr�c�dente du script est vraie. (0<$a<=2147483647)
* a=$((a)) 
conversion de $a en base 10
* until [ $a = 0 ] 
boucle until.jusqu'� ce que $a soit �gale � 0
cette boucle est imbriqu�e dans la boucle while
* do d=$((a%b)) 
$d vaut $a modulo $b cad reste de $a divis�e par $b
* eval d=\$d$d
assignation � $d de la valeur correspondant � d$d. r�f�rence indirecte � une variable 
contenant une variable dans son nom permise par eval. les variables d0 � d63 ont �t� 
d�finies au d�but du script en dehors de la boucle while.
par exemple si d=10, d10 valant a -> d=a. permet donc d'affecter les caract�res non 
num�riques pour les bases sup�rieures � 10
* e=$d$e
$e se remplit caract�re par caract�re � chaque passage dans la boucle en ajoutant $d � 
gauche de la valeur pr�c�dente de $e.
* a=$((a/b))
modification de la valeur de $a pour le prochain passage dans la boucle. $a vaudra $a 
divis� par $b en valeur enti�re. cad sans le reste de la division.
* done
fin de la boucle until lorsque la condition $a=0 est remplie
<explication du m�canisme>
chaque chiffre d'un nombre est le reste de la division de ce chiffre par sa base puis 
du r�sultat de la division pr�c�dente par la base etc ... jusqu'� ce que le r�sultat 
de la division par base soit 0.
exemple: 1234 en base 10
1234 divis� par 10 -> 123 reste 4
123 divis� par 10 -> 12 reste 3
12 divis� par 10 -> 1 reste 2
1 divis� par 10 -> 0 reste 1
en assemblant les restes successifs de droite � gauche, on obtient 1234.
</explication du m�canisme>

else if [ $a != 0 ] 2>/dev/null; then echo "mauvais param�tres: taper aide"; continue; 
fi
si la condition 0<$a<=2147483647 n'est pas remplie
* if [ $a != 0 ] 2>/dev/null
nouvelle condition imbriqu�e. le 2</dev/null prot�ge des messages d'erreur. si $a est 
diff�rent de 0. le cas o� $a �gal 0 a �t� pr�vu pr�c�demment. en fait tous les autres 
cas ne r�pondant � aucune des conditions pr�c�dentes:
a=exit
a=aide
a=0
0<$a<=2147483647
* then echo "mauvais param�tres: taper aide"
afficher le message d'erreur
* continue
retourner au d�but de la boucle while et afficher l'invite >
* fi
fin de la condition

fi
fin de la condition 0<$a<=2147483647

case $b in 8) b=0 ;; 10) b= ;; 16) b=0x ;; *) b="$b#" ;; esac
un case �crit sur une ligne. dans le cas ou $b (base) vaut 8 -> b=0, 10 -> b="rien", 
16 -> b=0x, et n'importe quoi d'autre -> b=$b#
permet l'affichage du r�sultat grace � la commande suivante dans un format 
correspondant � la base.

echo "$b$e"
affichage du r�sultat 
$b pour la base et puis $e

done
fin de la boucle while. la sortie est obtenue en tapant exit, condition si $a = exit.

derni�re partie:

exit 0
condition de sortie du script. celui-ci renvoie 0

vala. en esp�rant avoir fait plaisir :)

bye
jipe

Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com";

Répondre à