SHELL - Quelques petites questions

Bonjour !!

J’ai une petite question sur mon script :

[code]#! /bin/sh

echo "Entrez votre adresse IP :"
read rep

oct1=${rep%%.}
rl1=${rep#
.}
oct2=${rl1%%.}
rl2=${rl1#
.}
oct3=${rl2%%.}
oct4=${rl2#
.}

for (( i=1 ; i<=4 ; i++ ))
do
echo $oct$i
done[/code]

“$oct$i” ne passe pas. Je n’ai que 1, 2, 3, 4 qui s’affiche, soit uniquement la valeur de $i uniquement…

Quelqu’un a-t-il une solution ?

Merci d’avance pour toute aide !!!

il faut utiliser eval

tu voudrait avoir quoi comme résultat ?

met

echo $[oct$i]

En fait, je voudrais créer un script qui convertit l’adresse ip en binaire.
Enfin, j’ai déjà créé le script et je veux l’optimiser en mettant une boucle “for” :

[code]#! /bin/sh

#echo “Entrez votre adresse IP :”
#read rep
echo $rep

conv_bin () {
oct1=${rep%%.}
rl1=${rep#
.}
oct2=${rl1%%.}
rl2=${rl1#
.}
oct3=${rl2%%.}
oct4=${rl2#
.}

for (( i=1 ; i<=4 ; i++ ))
do
case $[oct$i] in
’1’)
declare -a tab$i[32]
tab$i[1]=0;tab$i[2]=0;tab$i[3]=0;tab$i[4]=0;tab$i[5]=0;tab$i[6]=0;tab$i[7]=0;tab$i[8]=1
;;
‘2’)
declare -a tab$i[32]
tab$i[1]=0;tab$i[2]=0;tab$i[3]=0;tab$i[4]=0;tab$i[5]=0;tab$i[6]=0;tab$i[7]=1;tab$i[8]=0
;;


‘255’)
declare -a tab$i[32]
tab$i[1]=1;tab$i[2]=1;tab$i[3]=1;tab$i[4]=1;tab$i[5]=1;tab$i[6]=1;tab$i[7]=1;tab$i[8]=1
;;
*)
esac
done

echo "L’adresse : $oct1.$oct2.$oct3.$oct4 vaut en binaire :"
echo “${tab1[]} / ${tab2[]} / ${tab3[]} / ${tab4[]}”

declare -a tab[32]
j=1;k=1;l=1;m=1

for (( i=1 ; i<=8 ; i++ ))
do
tab[i]=echo ${tab1[j]}
j=expr $j + 1
done

for (( i=9 ; i<=16 ; i++ ))
do
tab[i]=echo ${tab2[k]}
k=expr $k + 1
done

for (( i=17 ; i<=24 ; i++ ))
do
tab[i]=echo ${tab3[l]}
l=expr $l + 1
done

for (( i=24 ; i<=32 ; i++ ))
do
tab[i]=echo ${tab4[m]}
m=expr $m + 1
done

echo " – "
echo ${tab[*]}
}[/code]

Grâce aux crochets, ça fonctionne, par contre c’est le “declare -a tab$i[32]” qui ne passe pas maintenant…

En gros
for (( i=1 ; i<=4 ; i++ ))
do
declare -a tab$i[32]
done
tab1[1]=89
echo ${tab1[1]}

fonctionne

Dans mon premier script, j’ai fait quatre selon qui convertissent en binaire dont voici le résultat :

[code]# ./test
Entrez votre adresse IP :
192.168.5.1
L’adresse : 192.168.5.1 vaut en binaire :
1 1 0 0 0 0 0 0 / 1 0 1 0 1 0 0 0 / 0 0 0 0 0 1 0 1 / 0 0 0 0 0 0 0 1

1 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1[/code]

Voici la réponse avec la boucle for :

[code]# ./test4
Entrez votre adresse IP :
192.168.5.1
./test4: line 592: tab1[1]=1: command not found
./test4: line 592: tab1[2]=1: command not found
./test4: line 592: tab1[3]=0: command not found
./test4: line 592: tab1[4]=0: command not found
./test4: line 592: tab1[5]=0: command not found
./test4: line 592: tab1[6]=0: command not found
./test4: line 592: tab1[7]=0: command not found
./test4: line 592: tab1[8]=0: command not found
./test4: line 520: tab2[1]=1: command not found
./test4: line 520: tab2[2]=0: command not found
./test4: line 520: tab2[3]=1: command not found
./test4: line 520: tab2[4]=0: command not found
./test4: line 520: tab2[5]=1: command not found
./test4: line 520: tab2[6]=0: command not found
./test4: line 520: tab2[7]=0: command not found
./test4: line 520: tab2[8]=0: command not found
./test4: line 31: tab3[1]=0: command not found
./test4: line 31: tab3[2]=0: command not found
./test4: line 31: tab3[3]=0: command not found
./test4: line 31: tab3[4]=0: command not found
./test4: line 31: tab3[5]=0: command not found
./test4: line 31: tab3[6]=1: command not found
./test4: line 31: tab3[7]=0: command not found
./test4: line 31: tab3[8]=1: command not found
./test4: line 19: tab4[1]=0: command not found
./test4: line 19: tab4[2]=0: command not found
./test4: line 19: tab4[3]=0: command not found
./test4: line 19: tab4[4]=0: command not found
./test4: line 19: tab4[5]=0: command not found
./test4: line 19: tab4[6]=0: command not found
./test4: line 19: tab4[7]=0: command not found
./test4: line 19: tab4[8]=1: command not found
L’adresse : 192.168.5.1 vaut en binaire :
/ / /

[/code]

Et j’ai constaté que c’est plus le tab$i qui passe mal que la déclaration du tableau… :frowning:

eval tab$i[3]=32

au lieu de tab$i[3]=32

OUAIS !!

Ca fonctionne !! Merci !!!

Je ne suis pas sur d’avoir bien compris l’utilité d’eval dans le man :

eval [arg ...] The args are read and concatenated together into a single command. This command is then read and executed by the shell, and its exit status is returned as the value of eval. If there are no args, or only null arguments, eval returns 0.

Si je traduis ca me donne (corrigé moi si je me trompe) :
Les arguments sont lus et enchaînés ensemble comme une seule commande. Cette commande est alors lue et exécutée par le shell, et sa valeur est retournée comme une valeur d’eval. Si il n’y a pas d’arguments ou seulement une valeur nulle, eval retourne 0.

Maintenant, dans notre cas pratique, on a : ‘eval tab$i[x]=Y’ au lieu de ‘tab$i[x]=Y’. En quelque sorte, si je ne me trompe pas, eval lit ‘tab$i[x]=Y’ et le renvoie, dans le cas où i=2 par exemple, ‘tab2[x]=Y’ en tant que tel ?

Quand tu tapes tab$i[3]=32

bash transformes ça en tab2[3]=32 et le eval repasse à bash cette chaine qui effectuve donc l’affectation désirée…

Ok. C’est bien ce que j’avais compris.
Merci beaucoup Fran !!

(PS je sais pas si c’est moi, ms les couleurs du forum sont bizarre… :open_mouth: )

Me revoilà avec de nouvelles questions :

Mon script fonctionne à merveille !! Maintenant, comme on peut le voir, c’est une fonction qui doit être utilisée. Cependant, cette fonction je voudrais qu’elle renvoie le tableau au script qui fait appel à la fonction. Mais je ne trouve que ‘return’ qui peut renvoyer qu’un entier. Est-ce que c’est réalisable ?

Autre chose qui n’a rien à voir, je veux créer un script qui demande d’être root au départ et qui demande de changer d’utilisateur au cours du script. J’ai intégré ‘su nom_utilisateur’ mais toutes les commandes qui suivaient passe toujours sous ‘root’… Comment puis-je faire ?

D’avance merci !!!

en shell, la valeur de retour est effectivement dédiée au code d’erreur, mais si c’est une fonction, et que tu veux accèder à la variable tableau de l’exterieur, il suffit peut être bêtement de la déclarer à l’exterieur de ta fonction, non ?
(mon shell est lointain, et je me demande même si les variables d’un script ne sont pas toutes globales, d’ailleurs)
PS: sinon, passes au perl…

Même réponse que MattOTop pour la valeur de retour. Pour le su, utilise syntaxe

su toto -c “ls -l”

par exemple pour effectuer une série de commande en tant que toto:

su francois -c whoami

francois

Ok!

Je vais tester le su toto -c ce soir. C’est pour un script de création d’utilisateur pour PostgreSQL. :smiley:

Sinon, y a beaucoup de différence entre le shell et le perl ?
J’imagine que le perl permet plus de chose que le shell ?

Merci beaucoup en tout cas !! J’apprécie beaucoup ce forum et toute l’aide qu’y m’est donnée !!! (il faut le dire de temps en temps, ca fait du bien !!:wink: )

Bash, malgré sa puissance, n’est qu’un langage de script au mieux. Perl est un vrai langage de programmation…

Le perl a l’avantage et l’inconvènient de ressembler à un peu tous les languages dont il est issu/inspiré (shell, awk, sed, C).
Si tu passes au perl, tu n’aura pas énormément de retouche à faire pour porter tes scripts shell en perl.
Par ailleurs, quels que soient tes réflexes de programmation (déclaratif, programmation logique, structuration objet), tu va retrouver tes marques.
Un bon développeur connaissant les bases du shell fait trés vite des choses classieuses en perl.
Les reflexes spécificiques au perl (tableau, réfèrences, instanciation, portée), viennent rapidement.

Perl a quand même un petit plus pour ceux qui maitrisent ce langage semble-t-il (je ne n’en fais pas partie loin de là), si on accepte d’écrire des programmes en Write_Only, on peut faire des chefs d’oeuvre de concision qui en 10 lignes te font ce que tu 'en tout cas moi) écris péniblement en 100 lignes et plus… Il y a des concours là dessus…

[quote=“fran.b”]Perl a quand même un petit plus pour ceux qui maitrisent ce langage semble-t-il (je ne n’en fais pas partie loin de là), si on accepte d’écrire des programmes en Write_Only, on peut faire des chefs d’oeuvre de concision qui en 10 lignes te font ce que tu 'en tout cas moi) écris péniblement en 100 lignes et plus… Il y a des concours là dessus…[/quote]c’est ce qu’on peut appeler monguer mon gars. :laughing:

C’est vrai que Perl c’est du costaud. Mais il a de la concurrence à son niveau.
Quid de haskel, ruby, python, qui sont aussi des langages que l’on peut integrer dans des scripts Linux, voire même Apache. Ce que je reproche à Perl, c’est justement cette façon d’utiliser les plus petits signes possibles pour faire des actions. Ça en devient illisible, et ça demande une attention soutenue (rapport café/ligne de script trés élevé). Le ruby est plus simple, car il utilise une syntaxe compréhensible. Haskel, je connais pas trop en fait, mais il paraît qu’il est pas mal. Python est sympa aussi, mais c’est un ancètre. Pour autant, on en finit pas de voir des petites applications Linux en python. Il y en a d’autre encore.