# SHELL - Quelques petites questions

**URL:** <https://www.debian-fr.org/t/shell-quelques-petites-questions/2948>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948 "2016-02-20T12:33:46Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/1 "2016-02-20T12:33:46Z")

</div>

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 !!!

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/2 "2016-02-20T12:33:46Z")

</div>

il faut utiliser eval

---

<div class="post-metadata">

**Author:** ![stonfi](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/54ee81/32.png) [@stonfi](https://www.debian-fr.org/u/stonfi)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/3 "2016-02-20T12:33:47Z")

</div>

tu voudrait avoir quoi comme résultat ?

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/4 "2016-02-20T12:33:47Z")

</div>

met

echo $[oct$i]

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/5 "2016-02-20T12:33:47Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/6 "2016-02-20T12:33:48Z")

</div>

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

fonctionne

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/7 "2016-02-20T12:33:48Z")

</div>

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… ☹

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/8 "2016-02-20T12:33:49Z")

</div>

eval tab$i[3]=32

au lieu de tab$i[3]=32

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/9 "2016-02-20T12:33:50Z")

</div>

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 ?

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/10 "2016-02-20T12:33:50Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/11 "2016-02-20T12:33:51Z")

</div>

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… 😮 )

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:33 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/12 "2016-02-20T12:33:57Z")

</div>

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 !!!

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/13 "2016-02-20T12:34:03Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/14 "2016-02-20T12:34:04Z")

</div>

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

#

---

<div class="post-metadata">

**Author:** ![Badaboumpanpan](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/67e7ee/32.png) [@Badaboumpanpan](https://www.debian-fr.org/u/Badaboumpanpan)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/15 "2016-02-20T12:34:04Z")

</div>

Ok!

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

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 !!😉 )

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/16 "2016-02-20T12:34:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/17 "2016-02-20T12:34:10Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/18 "2016-02-20T12:34:11Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![mattotop](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mattotop/32/3942_2.png) [@mattotop](https://www.debian-fr.org/u/mattotop)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/19 "2016-02-20T12:34:20Z")

</div>

[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. 😆

---

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:34 UTC](https://www.debian-fr.org/t/shell-quelques-petites-questions/2948/20 "2016-02-20T12:34:20Z")

</div>

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.
