IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[bash] syntaxe incorrecte pour paramètre de md5sum


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    [ ! -e PATH_DEFAULT ] && PATH_DEFAULT=`pwd`
    Peut s'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : ${PATH_DEFAULT:="$(pwd)"}
    Ou même (normalement la variable d'environnement $PWD est définie) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : ${PATH_DEFAULT:="$PWD"}

    J'ai pas testé mais comme ça, ça dit quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    md5sum -b "$target_$numFiles_parts."*

    Et là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    *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.

  4. #4
    Membre averti Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Points : 337
    Points
    337
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Points : 99
    Points
    99
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2015, 23h08
  2. Erreur : Valeur incorrecte pour ce champ
    Par Invité dans le forum Access
    Réponses: 5
    Dernier message: 04/01/2006, 12h09
  3. quelle syntaxe svp pour ce code ?
    Par man123 dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2005, 00h05
  4. Syntaxe incorrecte vers 'where'.
    Par lepeintre dans le forum ASP
    Réponses: 15
    Dernier message: 19/05/2005, 11h57
  5. Syntaxe PARAMETERS pour requête sous VBA
    Par GAGNON dans le forum VBA Access
    Réponses: 3
    Dernier message: 28/11/2003, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo