Aide Débutant Unix

Bonjour,
tout d'abord soyez clément parce que je débute.

Mon problème est avant tout un problème de traduction, j'aimerais pouvoir traduire le fait d'appartenir à une liste de chaines.
Apparemment la boucle for me permet initialement de choisir un nom de valeur dans une liste de chaines, néanmoins j'aimerais reussir à le faire sans boucle.

Pour prendre un exemple : j'aimerais mettre une condition du type if nom_valeur appartient à grep [^df] nom_fichier
je sais que for nom_valeur in `grep [^df] nom_fichier`me prendra les memes valeurs seulement l'ennui c'est que je suis obligé de commencer une boucle après, or tout ce que je veux c'est mettre une condition.

Merci d'avance.
Configuration: Windows Vista
Internet Explorer 7.0

9 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    Je ne suis pas sûr d'avoir tout compris, mais bon...
    grep 'nom_valeur' < <(grep '[^df]' fichier)
    grep '[^df]' fichier | grep 'nom_valeur'
    devrait peut être faire ton affaire ;-))
    1. je me suis trompé je voulais écrire ^[df].
      En fait je comprends comment insérer ce que tu viens de me donner au sein de mon if.
      1. désolé, je ne sais pas éditer mon message.
        Je voulais dire que je ne comprenais pas .
        1. Modérateur
          Donne un exemple plus parlant (concret) de ce que tu veux, avec des exemples et à la limite la boucle "for" avec les "if...then...else" que tu ne veux pas et la sortie qu'elle génère. On essaiera d'adapter en fonction...
          1. très bien, je cherche à realiser un script.
            ce script que fait-il ? il prend un parametre un fichier appelons le A.
            dans A il y a deux colonnes de texte, dans la première il y a des lettres et dans la deuxième des mots :
            d connexion
            f arant
            e rzigova
            d rangeant

            l'idée du script est de créer un fichier si la ligne commence par un f, un répertoire si elle commence par un d, si la lettre differe il doit faire un echo "lettre" : type inconnu.

            donc dans mon exemple le fichier devrait creer un repertoire connexion, un fichier arant ....

            plusieurs problèmes se posent à moi :
            le premier c'est d'éviter qu'il me creer des fichier/repertoires d e et f, autrement dit je ne sais pas comment dire a mon script : "des que la ligne commence par un d tu sautes deux cases et tu crees un fichier avec le nom qui suit".

            je sais que grep ^[d] A donne toutes les lignes qui commencent par d. Seulement je ne sais pas comment lui dire de "faire un saut". Donc je tente de multiples parades.
            Ma derniere en tête était de créer une condition du type : if machin appartient a grep ^[d] A then mkdir "./$machin"
            mais surtout [ "./$machin" != "./d" ].

            seulement en plus de pas savoir comment lui demander de prendre un machin qui est dans un grep, je sais que mon test [ "./$machin" != "./d" ] empeche de creer n'importe quel répertoire qui s'appelle d, or ce n'est pas du tout ce que je veux car on peut toujours imaginer un fichier A avec une ligne :
            d d

            mon dernier probleme réside dans mon echo en cas de type inconnu, en effet pour n'importe quelle lettre autre que f et d je dois faire echo "lettre en question" : "type inconnu".
            Or je ne sais pas du tout comment afficher la lettre en question (dans mon exemple il s'agit bien sur du e)

            j'espère que tout est clair,
            Merci d'avance.
            1. Modérateur
              [tmpfs]$ ls
              A  foo.sh*
              
              [tmpfs]$ cat A
              d connexion
              f arant
              e rzigova
              d rangeant
              
              [tmpfs]$ cat foo.sh
              #! /bin/bash
              
              while read line
              do
              case ${line:0:1} in
              d)      echo "Création du répertoire ${line:2}"
                      mkdir ${line:2}
                      ;;
              f)      echo "Création du fichier ${line:2}"
                      touch ${line:2}
                      ;;
              *)      echo "Lettre : \"${line:0:1}\" inconnue au bataillon."
                      ;;
              esac
              done < $1
              
              [tmpfs]$ ./foo.sh A
              Création du répertoire connexion
              Création du fichier arant
              Lettre : "e" inconnue au bataillon.
              Création du répertoire rangeant
              
              [tmpfs]$ ls -l
              total 8
              -rw-rw-r--  1 jp jp  41 nov 30 13:12 A
              -rw-rw-r--  1 jp jp   0 nov 30 13:21 arant
              drwxrwxr-x  2 jp jp  40 nov 30 13:21 connexion/
              -rwxrwxr-x  1 jp jp 256 nov 30 13:20 foo.sh*
              drwxrwxr-x  2 jp jp  40 nov 30 13:21 rangeant/
              
              [tmpfs]$  
              ;-))
              1. je ne connais pas encore case mais merci beaucoup j'y vois plus clair.
                1. En fait on me dit qu'il y a une erreur de syntaxe à la ligne `case ${line:0:1} in plus précisement une erreur de syntaxe sur le jeton `in
                  1. Modérateur
                    Quel shell ?

                    As-tu fait un copier/coller du script ou l'as-tu retapé à la main ?
                    1. je suis sur ubuntu
                      et oui je l'ai copier/coller