Forum Programmation.shell Problème utilisation variables

Posté par  .
Étiquettes : aucune
0
15
sept.
2008
Bonjour à tous !!

Dans un dossier fichiers, j'ai des fichiers (répétition, ook), qui sont sous la forme :

fichierXX.txt (ex : fichier01.txt)
J'ai donc créé ce script :

nbfichiers=`ls -1 fichiers | wc -l`

for (( i=1; i != nbfichiers+1; i++ ))
do
if [ $i -le 9 ] # <= 9
then
fonction fichiers/fichier0$nbfichiers.txt
else
fonction fichiers/fichier$nbfichiers.txt
fi

done


Mais fonction fichiers/fichier0$nbfichiers.txt est incorrect, car lors de l'appel ca donne :
shell: line 23: 10747 Erreur de segmentation fonction fichiers/fichier0$nbfichiers.txt

Alors que sur le fonction fichiers/fichier$nbfichiers.txt, aucune erreur !!

Pouvez-vous me corriger svp ?
  • # Pas besoin de if

    Posté par  (site web personnel) . Évalué à 2.


    ...
    do
    file=`printf fichiers/fichier%02d.txt $i`
    fonction $file
    done


    Et pour faire encore plus simple

    for file in fichiers/*
    do
    fonction $file
    done
  • # hou la on se complique la vie...

    Posté par  . Évalué à 2.

    fonction $(printf "fichiers/fichier%02dnbfichiers.txt" $i)

    et on vire le if ^^

    par contre l'erreur de segmentation, a moins que tu aies des caractère non imprimable dans don shell je vois pas
    ( j'ai eu ce genre de blague avec cygwin selon les fins de lignes \r\n ou \n et sur des unix qui récupérait des script écrits sous windows)

    ps: en bash je préfère nettement le $( ) qui est équivalent à ` ` ( qui nonobstant le fait d'éviter de se torturer les doigts sur un clavier azerty, a l'intérêt
    a ) d'être plus lisible ( on le confond pas avec des ', on voit plus facilement où ça finit )
    b ) d'être nettement plus imbricable
    c ) d'être plus homogène avec des écriture $(( )) ( équivalent à `expr `

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: hou la on se complique la vie...

      Posté par  . Évalué à 1.

      En fait, le segfault porte sur ma fonction qui a besoin d'un fichier correct pour marcher.
      Sinon, pour mon dossier fichiers/, il y a un fichier que je n'utilise pas.

      Donc en fait nbfichiers = commande ls - 1

      Ta commande me donne :
      shell: line 16 : fichiers/fichier01.txt: Permission non accordée (pour tous les fichiers)

      Pourtant c'est pas une erreur de droit :

      -rw-r--r-- 1 animatrix animatrix 403 sept. 13 23:57 fichier01.txt
  • # Nouveau pb

    Posté par  . Évalué à 1.

    C'est à nouveau moi, lol !

    J'aimerais passer en argument le nom du dossier/fichier, j'ai essayé :

    if [ -z $2 ]
    then
    $2="Fichiers/fichiers"
    fi

    for file in ($2)*
    do

    Mais j'obtiens cette erreur :

    shell: line 12: =Fichiers/fichier: Aucun fichier ou dossier de ce type
    shell: line 15: Ouvre le fichier maj $file $3
    • [^] # Re: Nouveau pb

      Posté par  . Évalué à 1.

      En bash, il n'y a pas de $ devant un nom de variable lors de l'assignation.
      La ligne $2="Fichiers/fichiers" est donc incorrecte.
      • [^] # Re: Nouveau pb

        Posté par  . Évalué à 1.

        Ok, merci.
        Parce qu'en fait, je croyais qu'il fallait en mettre toujours de l'utilisation d'une fonction
    • [^] # Re: Nouveau pb

      Posté par  . Évalué à 2.

      et encore un if de trop :D

      var=${2:-Fichiers/fichiers}

      for file in ($var)*
      do

      ou plus court
      for file in ${2:-Fichiers/fichiers}*
      do

      le ${var:-plop} permet une substitution par plop si var est vide ou null
      sinon tu as les assignation ${var:=plop}

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: Nouveau pb

        Posté par  . Évalué à 1.

        Ok, cette écriture est géniale, et me permet donc d'éviter d'écrire des doublons.
        Ce qui est dommage c'est que dans la plupart des tutos que j'ai trouvé sur le net, elle n'est pas indiqué, alors que c'est un vrai raccourci.

        En tout cas, merci beaucoup pour l'aide
  • # Comment couper les cheveux en quatre ...

    Posté par  . Évalué à 2.

    ...avec une scie circulaire.

    Tout ton bazard

    nbfichiers=`ls -1 fichiers | wc -l`
    for (( i=1; i != nbfichiers+1; i++ ))
    do
    if [ $i -le 9 ] # <= 9
    then
    fonction fichiers/fichier0$nbfichiers.txt
    else
    fonction fichiers/fichier$nbfichiers.txt
    fi
    done

    peut se résumer à

    fonction fichiers/fichier*.txt

    Et si tu veux t'assurer que tu ne prend que les fichier*.txt à deux chiffres ça donne

    fonction fichiers/fichier[0-9][0-9].txt


    Et si ta fonction est longue et que tu veux avoir un état d'avancement tu peux faire un truc du genre

    for f in fichiers/fichier*.txt;do
    echo $f
    fonction "$f"
    done

    (les guillements autours du $f ne sont pas utile dans cet exemple, mais dans l'absolu c'est nécessaire au cas où les noms de fichiers contiendraient des espaces, ou autres caractères amusants)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.