#1 Le 07/10/2008, à 17:50
- fr33dom
Not found [RESOLU]
bien le bonjour a vous tous et toutes
je suis sous linux depuis déja quelques semaines, et je me suis lancé dans la programmation.
mais je suis confronté à un problème que je n'arrive pas a résoudre.
pour certains préiphèrique usb la fonction ejecté avec le clic droit ne fonctionne pas, j'ai décidé de m'amuser à créer un sript pour pouvoir faire ceci.
mon script affiche tous les éléments ce trouvant dans media et j'aimerai choisir le périphérique avec un chiffre en créant un tableau mais je n'arrive pas a le créer, le message d'erreur est le suivant :
./test: 14: tabl[1]: not found
test étant le nom de mon fichier
voici le code entier défois que j'ai fait une erreur
#!/bin/sh
echo "####################################################"
echo "#############Choisissez l'USB à éjecter#############"
echo "####################################################"
echo " "
i=1
for usbb in `ls -1 /media`;
do
echo "$i - $usbb"
tabl[$i] = $usbb
i=$(($i+1))
echo " "
done [b]LIGNE 14[/b]
#permet d'entrer le périph à ejecter
echo "#####Lequel est à ejecter#####"
read ejecte
#éjecte le périph demandé
sudo umount /media/$ejecte
echo "Usb déconnecté"
j'espère que quelqu'un pourra m'aider
par avance merci
Dernière modification par fr33dom (Le 09/10/2008, à 09:36)
Hors ligne
#2 Le 07/10/2008, à 17:56
- wido
Re : Not found [RESOLU]
#tabl[$i] = $usbb
en mettant un # tu n'as plus de problème
Hors ligne
#3 Le 07/10/2008, à 17:59
- tiky
Re : Not found [RESOLU]
i=1
for usbb in $(ls /media)
do
tabl[$i]=$usbb
i=$((i+1))
done
Comme pour la déclaration d'une variable, la déclaration d'un tableau bash doit se faire sans espace entre le signe égal, l'identificateur et sa valeur. Par ailleurs `` est obsolète, il faut lui préférer $().
Pour parcourir le tableau ainsi formé:
for item in ${tabl[*]}
do
echo $item
done
Dernière modification par tiky (Le 07/10/2008, à 18:05)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#4 Le 07/10/2008, à 18:00
- fr33dom
Re : Not found [RESOLU]
si javais su que c'était aussi simple lol
merci bcp.
et si j'avais voulu faire
usbb$i = $usb
avec ceci j'ai tout essayé mais je n'ai pas trouver la bonne syntaxe
Hors ligne
#5 Le 07/10/2008, à 18:32
- tiky
Re : Not found [RESOLU]
Il faut utiliser les variables dynamiques:
name="usbb$i"
eval "$name=$value"
echo ${!name}
Attention:
Il faut utiliser "" et non '' pour eval car $name doit impérativement être remplacé par son contenu avant d'être évalué.
Maintenant le tableau est une solution bien plus propre puisque tu peux facilement le parcourir, atteindre un élément et connaître le nombre d'éléments.
Dernière modification par tiky (Le 07/10/2008, à 18:33)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#6 Le 07/10/2008, à 19:08
- fr33dom
Re : Not found [RESOLU]
erf, je suis dsl, je viens de faire plusieurs test avec les deux codes, mais aucune ne fonctionne.
Wido le tiens me met le tableau en commentaire, et ne me le créé pas, quant à toi tiky j'ai toujours le message d'erreur
Hors ligne
#7 Le 07/10/2008, à 19:15
- tiky
Re : Not found [RESOLU]
Fais un copier/coller exacte du code ici ( en utilisant la balise code du forum ), et donne le message d'erreur exact.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#8 Le 07/10/2008, à 19:18
- fr33dom
Re : Not found [RESOLU]
#!/bin/sh
echo "####################################################"
echo "#############Choisissez l'USB à éjecter#############"
echo "####################################################"
echo " "
i=1
for usbb in $(ls /media)
do
echo "$i - $usbb"
tabl[$i]=$usbb
i=$(($i+1))
echo " "
done
#permet d'entrer le périph à ejecter
echo "#####Lequel est à ejecter#####"
read ejecte
#éjecte le périph demandé
sudo umount /media/$ejecte
echo "Usb déconnecté"
et les message d'erreur sont :
1 - cdrom
./test: 14: tabl[1]=cdrom: not found
2 - cdrom0
./test: 14: tabl[2]=cdrom0: not found
3 - cdrom1
./test: 14: tabl[3]=cdrom1: not found
Hors ligne
#9 Le 07/10/2008, à 19:29
- tiky
Re : Not found [RESOLU]
Le code fonctionne chez moi. Le problème ne vient peut-être pas du script.
Note: Tu n'es pas obligé de mettre un $ devant le i dans une évaluation arithmétique $(()), ce qui donne: $((i+1))
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#10 Le 07/10/2008, à 19:32
- fr33dom
Re : Not found [RESOLU]
arf de c..... de bique
je vais essayé de voir alors qu'est vce qui va pas, mais je crains de ne pouvoir déceler ce qui ne va po snif
Hors ligne
#11 Le 07/10/2008, à 20:06
- wido
Re : Not found [RESOLU]
chez moi j'ai:
####################################################
#############Choisissez l'USB à éjecter#############
####################################################
/home/wido/Bureau/script: 12: tabl[1]=cdrom: not found
/home/wido/Bureau/script: 12: tabl[2]=cdrom0: not found
/home/wido/Bureau/script: 12: tabl[3]=cdrom1: not found
/home/wido/Bureau/script: 12: tabl[4]=disk: not found
#####Lequel est à ejecter#####
Dernière modification par wido (Le 07/10/2008, à 20:06)
Hors ligne
#12 Le 07/10/2008, à 20:08
- tiky
Re : Not found [RESOLU]
chez moi j'ai:
#################################################### #############Choisissez l'USB à éjecter############# #################################################### /home/wido/Bureau/script: 12: tabl[1]=cdrom: not found /home/wido/Bureau/script: 12: tabl[2]=cdrom0: not found /home/wido/Bureau/script: 12: tabl[3]=cdrom1: not found /home/wido/Bureau/script: 12: tabl[4]=disk: not found #####Lequel est à ejecter#####
Je sais pourquoi, sur ma Gentoo, /bin/sh pointe sur bash et pas dash. Cette syntaxe n'est pas posix. Il faut mettre bash au lieu de sh chez vous comme chez moi ( pour la portabilité entre les GNU/Linux ).
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#13 Le 07/10/2008, à 20:17
- wido
Re : Not found [RESOLU]
#!/bin/bash
echo "####################################################"
echo "#############Choisissez l'USB à éjecter#############"
echo "####################################################"
echo " "
i=1
for usbb in $(ls /media)
do
tabl[$i]=$usbb
i=$((i+1))
done
#permet d'entrer le périph à ejecter
echo "#####Lequel est à ejecter#####"
read ejecte
#éjecte le périph demandé
sudo umount /media/$ejecte
echo "Usb déconnecté"
resultat des courses:
wido@desktop:~$ '/home/wido/Bureau/script'
####################################################
#############Choisissez l'USB à éjecter#############
####################################################
#####Lequel est à ejecter#####
j'ai inséré un dvd, il n'y a pas la liste des périph
EDIT:il y a plus simple : http://www.getdeb.net/app/Ejecter
Dernière modification par wido (Le 07/10/2008, à 20:18)
Hors ligne
#14 Le 07/10/2008, à 20:18
- fr33dom
Re : Not found [RESOLU]
en effet sa marche déja mieu
merci beaucoup
mais j'ai un autre souci
lorsqu'il me fait la liste des périphériques, si j'ai le malheur d'en avoir une avec un espace il me le met en deux fois, je m'explique :
1 - cdrom
2 - cdrom0
3 - cdrom1
4 - CL_
5 - FR33DOM
6 - LaCie
ici il y a une clé usb se nommant clé fr33dom mais qui est sur l'emplacement 4 et 5 et mon dd externe lacie, comment se fait ce qu'il l'ai mis en 2 fois ?
Hors ligne
#15 Le 07/10/2008, à 20:29
- tiky
Re : Not found [RESOLU]
Donc c'est résolu
Je viens de lire que c'est bien posix cette syntaxe. Je ne sais pas pourquoi ça ne fonctionne pas avec dash.
Dernière modification par tiky (Le 07/10/2008, à 20:30)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#16 Le 07/10/2008, à 20:40
- tiky
Re : Not found [RESOLU]
Il faut changer l'IFS ( Internal Field Separator ): http://www.bash-hackers.org/wiki/doku.php/syntax/expansion/wordsplit?s[]=ifs
Elle définie les caractères qui délimitent les mots dans le shell. Par défaut, c'est l'espace, le retour à la ligne et la tabulation. Il suffit de modifier ce comportement:
IFS="
"
....
Attention à ne mettre aucun espace après la première double quote.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#17 Le 07/10/2008, à 20:40
- fr33dom
Re : Not found [RESOLU]
arf, j'y ai cru mais ce que je vois d'affiché est :
1 - cdrom
2 - cdrom0
3 - cdrom1
4 - CL_\
5 - FR33DOM
6 - LaCie
il y a un \ qui s'est ajouter mais sans plus
Hors ligne
#18 Le 07/10/2008, à 20:40
- tiky
Re : Not found [RESOLU]
Oui j'y ai cru aussi, j'ai modifié ma réponse Je pensais qu'il n'était pas nécessaire de modifier IFS, mais visiblement si
Dernière modification par tiky (Le 07/10/2008, à 20:41)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#19 Le 07/10/2008, à 20:43
- fr33dom
Re : Not found [RESOLU]
j'avoue bien joué, mais excuse moi, ou faut il mettre le code que tu as mis ? dans mon fichier ds les premières lignes ?
Hors ligne
#20 Le 07/10/2008, à 20:47
- tiky
Re : Not found [RESOLU]
Tu dois le mettre avant la boucle for.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#21 Le 07/10/2008, à 20:55
- fr33dom
Re : Not found [RESOLU]
ok, cela ùme donne encore une nouvelle chose
on avance c'est cool
maintenant j'ai un autre message
j'ai mon programme :
#!/bin/bash
IFS="
"
....
echo "####################################################"
echo "#############Choisissez l'USB à éjecter#############"
echo "####################################################"
echo " "
i=1
for usbb in $(ls -b /media)
do
echo "$i - $usbb"
tabl[$i]=$usbb
i=$(($i+1))
echo " "
done
#permet d'entrer le périph à ejecter
echo "#####Lequel est à ejecter#####"
read ejecte
#éjecte le périph demandé
sudo umount /media/${tabl[ejecte]}
echo "Usb déconnecté"
et voici le message qui en résulte si je fait le choix 4, pour retirer ma clé qui contient un espace :
1 - cdrom
2 - cdrom0
3 - cdrom1
4 - CL_\ FR33DOM
5 - LaCie
#####Lequel est à ejecter#####
4
CL_\ FR33DOM
Password:
umount: /media/CL_\ FR33DOM: n'a pas été trouvé
Hors ligne
#22 Le 07/10/2008, à 21:01
- tiky
Re : Not found [RESOLU]
Retire l'option -b à ls . Elle ne sert à rien finalement.
#!/bin/bash
echo "####################################################"
echo "#############Choisissez l'USB à éjecter#############"
echo "####################################################"
echo
i=1
IFS="
"
for usbb in $(ls /media)
do
echo "$i - $usbb"
tabl[$i]=$usbb
i=$((i+1))
echo
done
echo -n 'n°: '
read ejecte
sudo umount "/media/${tabl[ejecte]}"
Les .... c'était pour dire: la suite du code. Il fallait pas recopier évidemment. J'ai retiré les commentaires, ils ne sont pas pertinents étant donné que le code que tu as commenté est particulièrement simple.
Dernière modification par tiky (Le 07/10/2008, à 21:03)
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#23 Le 07/10/2008, à 21:10
- tiky
Re : Not found [RESOLU]
Tu peux aussi remplacer la commande ls /media par:
ls -l /media | grep '^d' | awk '{print $9}'
L'avantage de ce code c'est qu'il exclu les fichiers dans /media qui ne sont pas des dossiers.
Conseil d'expert: il vous faut un dentifrice adapté...
Hors ligne
#24 Le 07/10/2008, à 21:11
- fr33dom
Re : Not found [RESOLU]
Yes merci bcp
je vais pouvoir faire bien mumuse avc maintenant en faisant d'autre truc
encore merci
Hors ligne
#25 Le 07/10/2008, à 21:20
- Link31
Re : Not found [RESOLU]
#tabl[$i] = $usbb
en mettant un # tu n'as plus de problème
Pas mal celle-la
Il faut que je pense à la ressortir
Dernière modification par Link31 (Le 07/10/2008, à 21:20)
Hors ligne