Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/06/2011, 22h39   #1
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Par défaut [bash] syntaxe incorrecte pour paramètre de md5sum

Bonjoir.

Je rencontre de grandes difficultés à utiliser md5sum avec un paramètre variant.

Voici le code (inachevé) en entier, mais seule la ligne 45 pose problème :

md5sum -b `"$target"_"$numFiles"_"parts.*"`

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
 
   # Déclaration de la taille de découpage SIZE et du répertoire de sélection de fichier initial PATH_INITIAL,
   # ATTENTION il est impératif de ne pas utiliser d'espaces avant ou après le signe d'affectation '=', sinon le script ne s'éxécutera pas correctement,
   # car il y aura une erreur de syntaxe, c'est une caractéristique intrasèque du bash.
   # La casse n'est pas pris en compte et vous pouvez utilisez indifféremment les préfixes SI ou binaire, consultez http://fr.wikipedia.org/wiki/Octet
   # pour plus d'informations à ce sujet, veuillez noter que je me suis arrêté au giga, mais libre à vous d'éditer le code si vous avez besoin d'une
   # unité plus grande (wtf ?).
 
   # ATTENTION, SEULS LES NOMBRES ENTIERS SONT ACCEPTÉS et il faut au moins 1 espace entre l'entier et le préfixe
 
   SIZE='333 o'
 
   # Cette valeur change à chaque fois pour le dernier dossier qui a été sélectionné, il n'est donc pas vraiment utile de lui donner une valeur manuellement
   # Mais ce n'est pas encore implanté (zenity n'est pas suffisant pour cela et d'autres choses que je voudrais implanter)
 
   PATH_DEFAULT=""                                                
 
   # Script proprement dit, n'éditez pas le code en dessous de cette ligne sans savoir ce que vous faites
 
   # Note personnelle : bash ne supporte pas les fonctions vides, au moins mettre true si on prévoit d'écrire le contenu de la fonction plus tard,
   # même combat pour les if et probablement bien d'autres structures (toutes ?)
 
   Cut() {
 
      [ ! -e "$target" ] && exit # boite de dialogue fermée, pas de fichier sélectionné.
 
      local -i i=`stat -c %s "$target"`
 
      if (( i<$size )); then
         zenity --info --text="Le fichier n'a pas besoin d'être découpé"
         exit
      fi
 
      # on détermine combien de fichiers il va falloir créer.
 
      declare -i last_size=i%size
      declare -i numFiles=i/size
      (( last_size>0 )) && (( numFiles++ ))
 
      # on découpe le fichier
 
      split --bytes=$size -d "$target" "$target"_"$numFiles"_"parts."
 
      md5sum -b `"$target"_"$numFiles"_"parts.*"`
 
   }
 
   Paste() {
      true
   }
 
   SelectFile() {
   # creation boite de dialogue de sélection de fichier
 
      target=`zenity --file-selection --title="Sélectionner un fichier à $1"`
 
   }
 
   [ ! -e PATH_DEFAULT ] && PATH_DEFAULT=`pwd` # si dossier inexistant : affectation au dossier courant
 
   # on s'affranchit de la casse en mettant tout en minuscule
 
   SIZE=${SIZE,,}
 
   # extraction de la taille et du préfixe utilisé
 
   set $SIZE
 
   # transformation en octets selon le préfixe utilisé
 
   declare -i i
 
   case $2 in
 
      o) i=1 ;;
      ko) i=10**3 ;;
      mo) i=10**6 ;;
      go) i=10**9 ;;
 
      kio) i=2**10 ;;
      mio) i=2**20 ;;
      gio) i=2**30 ;;
 
      *) # prefixe invalide
 
   esac
 
   declare -i size=$1*i
   unset i
 
   # creation boite de dialogue de saisie
 
   operation=`zenity \
   --entry \
   --title="Choisir une opération" \
   --text="Ecrire C pour couper et P pour coller :"`
 
   operation=${operation,,} # on force le string en minuscule, pour ignorer la casse
 
   case $operation in
 
      c) SelectFile "couper" ; Cut ;;
      p) SelectFile "coller" ; Paste ;;
      *) # operation invalide
 
   esac
 
   sleep 5
Pourquoi l'emploi de `` ?

Parce que j'ai cru comprendre qu'en gros cela remplace les expressions par leur résultat, et comme j'ai la même erreur si j'utilise comme paramètre une constante (chemin écrit à la main) avec "", mais que c'est correct sans "", je me suis dit que c'était peut être la solution à mon problème.

Comme vous l'avez probablement deviner je suis novice en la matière, c'est mon premier essai en bash, soyez indulgents et j'accepte volontiers toute critique constructive.
A propos de zenity, c'est peut être pas forcément adapté ici mais je voulais simplement essayer cet outil.

Je précise que dans mon chemin absolu il n'y a pas d'espaces (j'ai renoncé pour l'instant à supporter les fichiers avec un nom d'espace dans leur nom, car je galère beaucoup trop à trouver les syntaxes adéquates)

Quelle serait donc la syntaxe appropriée ?

Sinon, y'a moyen de travailler sur un fichier que split a créé dès qu'il a été créé ? (et non après que tous ont été créés).
J'ai essayé avec un pipeline | , mais cela n'avait pas d'effet.

Merci d'avance.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 22h53   #2
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par AnozerOne Voir le message
Pourquoi l'emploi de `` ?
Tu devrais préférer la forme $(commande) qui est plus moderne, plus lisible, et plus confortable (mieux imbricable).


Code :
[ ! -e PATH_DEFAULT ] && PATH_DEFAULT=`pwd`
Peut s'écrire :
Code :
: ${PATH_DEFAULT:="$(pwd)"}
Ou même (normalement la variable d'environnement $PWD est définie) :
Code :
: ${PATH_DEFAULT:="$PWD"}

J'ai pas testé mais comme ça, ça dit quoi ?
Code :
md5sum -b "$target_$numFiles_parts."*

Et là :
Code :
1
2
3
operation=${operation,,} # on force le string en minuscule, pour ignorer la casse
 
   case $operation in
Tu peux faire directement :
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/06/2011, 23h19   #3
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
*PATH : Je ne maîtrise pas encore cette syntaxe conditionnelle, mais je vois un avantage à la mienne plus verbeuse, je peux basculer rapidement sur un if/then (si jamais la structure devient plus complexe ultérieurement).
Je me pencherais là dessus quand ca sera le moment venu.

*md5sum : Cela ne fonctionne pas, en effet les variables ne sont pas reconnus, à cause de l'emploi de l'underscore sans ""

*operation : Sauf que je suis suceptible d'utiliser la variable operation plus tard (du moins j'étais parti là dessus)

$() vs ``

Ouai c'est vrai d'ailleurs j'ai déjà perdu un temps fou à cause d'un ` en trop ou pas assez, ou mal placé.
A plus forte raison car j'ai des "bêtes d'orage" qui y ressemblent fortement entre l'écran proprement dit et la plaque de verre.

Merci.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 23h45   #4
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par AnozerOne Voir le message
*md5sum : Cela ne fonctionne pas, en effet les variables ne sont pas reconnus, à cause de l'emploi de l'underscore sans "
Comme ça alors peut-être :
Code :
md5sum -b "${target}_${numFiles}_parts."*
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/06/2011, 09h15   #5
Membre du Club
 
Inscription : juillet 2006
Messages : 166
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 166
Points : 61
Points : 61
Cela fonctionne, j'ai relu l'excellent cours ftp://ftp-developpez.com/eric-sanchis/IntroProgBash.pdf, et en effet l'opérateur ${} est fait pour enlever les ambiguïtés (section 2.3).

Mea culpa et merci.
AnozerOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h21.


 
 
 
 
Partenaires

Hébergement Web