Code shell

Résolu
Bonjour à tous,

ça faisait longtemps que je n'étais pas venu, sympas le nouveau forum ;).

J'ai besoin d'aide sur un bout de code, je pense que pour vous cela va être facile.

ex :
################
/ccm/test> ls

toto

tatatiti

testtest

test2

test1:2

test1:3

test1:4
################

Je voudrais parcourir le dossier "test" et récupérer le preimier chiffre (soit 1 dans cette exemple) dans une variable.

#/bin/sh

###je récupère le chiffre 1 dans la variable $x par exemple (correspondant à test1:... ==> je voudrais de l'aide sur ça...

for i in 6

do

#Pour utiliser $x comme ça plus tard

... eth$x:$i

done

Merci d'avance pour votre aide.

++

6 réponses

  1. salut,

    Ce n'est pas très clair.
    parcourir le dossier "test" :
    for f in test/*; do echo "$f"; done

    récupérer le preimier chiffre (soit 1 dans cette exemple)
    donc il faut s'occuper uniquement des fichiers qui ont le format suivant:
    [[:alpha:]]*[[:digit:]]:[[:digit:]]
    ?
    et ne récupérer que le premier chiffre (entre les lettres et le deux-points)?

    On peut faire ça en bash, ou est-ce que ça doit être 100% portable?
    1. Bonjour,

      merci pour ta réponse et dsl pour le manque de clarté! Tu m'as quand même compris!

      =>J'aimerais parcourir le dossier "test" pour s'occuper uniquement des fichiers qui ont le format [[:alpha:]]*[[:digit1:]]:[[:digit2:]].

      => oui récupérer digit1.

      J'aimerais qu'il soit en .sh pour l'exécuter facilement car je vais m'en servir pour tester des processus.

      Si quelqu'un arrive a m'aider pour ça, je vais récupérer ce chiffre dans la variable $x par exemple et faire un truc du genre :

      for i in 6

      do

      #Pour utiliser $x comme ça plus tard

      ... eth$x:$i

      done

      Comme ça je vais pouvoir effectuer des actions sur les interfaces eth$x:$i

      J'espère que j'ai été plus clair.

      Merci ;)
      ++
      1. C'est quoi ce 6 ?
        for est censé boucler sur une liste, mais 6 n'est pas une liste.

        Ça reste un peu flou

        Si on reprend ton répertoire test
        $ cd test
        $ echo *[0-9]:[0-9]
        test1:2 test1:3 test1:4
        Voilà, ça affiche la liste des fichiers correspondant à peu près au motif que j'ai décrit plus haut.

        Ensuite? Ici, il n'y a que des 1. Admettons qu'à la place d'un echo, on utilise un for...

        Il va falloir utiliser sed pour extraire ce nombre, et l'assigner à x.

        Tu veux répéter les opérations autant de fois qu'il y a de fichiers qui correspondent ?

        Donc on assigne x, et si x change, alors on assigne x à la nouvelle valeur, et on effectue les opérations.
        1. 1=>Le 6 c'était pour restarter 6 interfaces réseaux par exemple :

          restart eth[digit1]:[1 à 6].

          2=>Normalement dans ce dossier, si tu récupère le digit1 sur un élément qui a matché c'est bon tu arrêter car les autres auront le même digit1.

          3=>Et puis mois une fois que la valeur est extraite je pourrai m'en servir pour faire l'étape 1.

          Est ce plus clair?

          Merci encore
          1. en sh, posix strict
            for f in test/*
            do
               y=$(echo "$f" |sed -n 's/.*\([0-9]\):.*/\1/p')
               test -n "$y" && {
                  test "$y" != "$x" && {
                     x=$y
                     for i in $(seq 1 6)
                     do
                        echo "eth$x:$i"
                     done
                  }
               }
            done
            1. Contributeur
              $ f="test1:2"
              
              $ echo "$f" | grep -o '\B[0-9]*'
              1

              ;-))
          2. Merci!! Je vais tester ça desuite.

            Je venais de faire ça x=$(ls |grep -o -m 1 "[0-9]")

            ça a l'air de fonctionner aussi.