Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 roll

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 sad

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]

wido a écrit :

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 smile
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 wink
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 wink Je pensais qu'il n'était pas nécessaire de modifier IFS, mais visiblement si smile

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 smile
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 wink. 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]

wido a écrit :
    #tabl[$i] = $usbb

en mettant un # tu n'as plus de problème roll

Pas mal celle-la lol
Il faut que je pense à la ressortir smile

Dernière modification par Link31 (Le 07/10/2008, à 21:20)

Hors ligne