Script Bash

Résolu/Fermé
Lee-San Messages postés 195 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 25 février 2011 - 23 févr. 2011 à 09:47
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 23 févr. 2011 à 10:34
Bonjour,

Je réalise actuellement un script pour ajouter plusieurs utilisateurs

Je souhaite déjà voir si dans ma boucle je peux afficher mes utilisateurs un par un (si cela fonctionne ensuite je pourrai facilement les ajouter) Mais j'ai un problème, voici mon script

#!/bin/bash

a=(Breno Solene Durant)

i=0

For i in $a
do

i=$i+1

echo ${a[i]}

done



Voilà c'est un script simple et pourtant en exécution il ne me renvoit que Breno. En gros il ne fais qu'un tour de boucle. Quelqu'un sait ou est le problème ?

Merci d'avance

1 réponse

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 févr. 2011 à 10:06
Salut,

Pour voir les erreurs d'un script, le mieux est de l'exécuter en mode débogage, en rajoutant "set -xv" en début de script.

Si on exécute ton script tel quel, voilà ce qu'on obtient (débogage activé) :

$ ./foo.sh 

a=(Breno Solene Durant)
+ a=(Breno Solene Durant)

i=0                             
+ i=0                           
                                
for i in $a                     
do                              
                                
i=$i+1                          
                                
echo ${a[i]}                    
                                
done                            
+ for i in '$a'                 
+ i=Breno+1                     
+ echo Solene
Solene
$

Déjà, incrémenté ta boucle avant même l'affichage du 1er nom, ce n'est pas bon ;-(
Ensuite comme tu le vois, ta variable "$i" sert à la fois pour le compteur de boucle et pour les items du tableau, pas bon ça ;-(

Le plus simple est de passer par une boucle empruntée au langage C :

$ cat foo.sh
#!/bin/bash

#set -xv

a=(Breno Solene Durant)

for ((i = 0; i < ${#a[*]}; i++))

do

echo ${a[i]}

done

$ ./foo.sh 
Breno
Solene
Durant

$

;-))
0
Lee-San Messages postés 195 Date d'inscription mardi 18 janvier 2011 Statut Membre Dernière intervention 25 février 2011
Modifié par Lee-San le 23/02/2011 à 10:16
ok merci !

Mais je comprend pas pourquoi tu initialise i à 0 dans le "for" et qu'ensuite tu l'incrémente avec i++. Sa veut dire qu'a chaque tour de boucle ton i est égal à 1 ?

Et si j'ai bien compris : i < ${#a[*]} veut dire : "tant que i est inférieur à l'ensemble des arguments du tableau a" ?

a et également a quoi sert le cat foo.sh ?^^
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 févr. 2011 à 10:34
Mais je comprend pas pourquoi tu initialise i à 0 dans le "for"
Dans un tableau la numérotation démarre à "zéro" (0), le 1er élément étant donc "${a[0]}".

et qu'ensuite tu l'incrémente avec i++. Sa veut dire qu'a chaque tour de boucle ton i est égal à 1 ?
Non à chaque tour mon "$i" est égal à la valeur précédente de $i + 1
i=0
i=0+1 => 1
i=1+1 => 2
i=2+1 => 3 (là on s'arrête vu que la valeur est plus grande...)


Et si j'ai bien compris : i < ${#a[*]} veut dire : "tant que i est inférieur à l'ensemble des arguments du tableau a" ?
Oui.


a et également a quoi sert le cat foo.sh ?^^
La commande "cat" sert à afficher le contenu d'un fichier (texte en général), c'était juste pour te montrer le contenu du script qui s'appelle "foo.sh".

;-))
0