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 :

Confusion nom de fichier et contenu du fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut Confusion nom de fichier et contenu du fichier
    bonjour
    j'essaie de créer une instruction qui prendra en paramètre un chemin
    /mac-de-vincent/users/vincent/truc/machin/chose/texmacs.tm
    et fera des manipulations dessus

    problème :
    si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fichier=${1:?"Vous devez fournir un path"}
    echo $fichier > ici.txt
    tronquer=$fichier
    while [-n $tronquer]
    do
    tronquer=$(cut -f2- -d/ $tronquer)
    done
    echo $tronquer
    ça ne marche pas car il considère `$fichier`et `$tronquer` comme des fichiers et non pas comme des variables de texte

    de plus, je me demande bien pourquoi le fichier `ici.txt`n'est pas créé : la commande `locate ici.txt` ne donne rien...

    je suis un peu perdu...

    merci de votre aide...

    ps je précise que j'utilise le bash sous la forme du terminal de mac os X. je sais qu'il y a de légères différences avec le bash de linux, j'ai hésité à poster sur le forum dédié

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    j'ai hésité à poster sur le forum dédié
    Dommage.

    la commande `locate ici.txt` ne donne rien...
    La commande locate est puissante et pas puissante. Il faut que la base de données de "locate" soit à jour.
    Donc il faut souvent faire un updatedb avant.
    Ce qui n'est pas cool.
    Il n'est juste pas au courant que tu as créé un fichier "ici.txt".

    Tu n'as pas respecté les espaces autour des crochets.
    Ne crois pas qu'il s'agisse de simples signes de ponctuation.
    C'est un raccourci pour la commande test. Il est donc nécessaire de mettre des espaces.
    Tu pourrais écrire aussi bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while test -n "$tronquer"
    `$fichier`et `$tronquer`
    Attention à la signification de la ponctuation, cette fois-ci.
    L'accent grave exécute.
    Ça m'étonnerait que tu veuilles exécuter "$fichier" et "$tronquer".

    il considère `$fichier`et `$tronquer` comme des fichiers
    Quel symptôme te permet une telle conclusion ?

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    Citation Envoyé par Flodelarab
    Ne crois pas qu'il s'agisse de simples signes de ponctuation.
    des règles de syntaxe s'appliquent aussi à la ponctuation.

    il faut TOUJOURS mettre les variables entre guillemets.

    il ne faut pas confondre le nom d'un fichier et le contenu de ce fichier !

    pourquoi changer le nom de la variable qui contient le nom du fichier ?

    il faut commenter son script, ça aide énormément à voir les contresens !
    par exemple, moi, je lis :
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    tantQue $variable existe; faire des_trucs; finTantQue
    cela crée une boucle infinie, parce qu'il n'y a aucune instruction faisant que la variable n'existe plus.

    d'une manière générale, il faut écrire ce qu'on veut faire AVANT de coder !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    salut et merci de la réponse

    j'avais mis des accents graves `locate`car je pensais que ça convertissait en code dans l'interface du forum, j'ai pas vérifié ça à la prévisualisation

    ce qui me fait penser qu'il considère $fichier$ comme un fichier et non une chaîne, c'est le résultat du cut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    fichier=${1:?"Vous devez fournir un path"}
    tronquer="$fichier"
    tronquer=$(cut -f2- -d/ $tronquer)
    echo $tronquer
    je l'ai exécuté par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /Users/moi/machin/truc/texmacs.sh /Users/moi/machin/truc/texmacs.sh
    et il a "cut"-é les lignes du fichier lui-même et nom pas le nom du fichier.

    je pense que ça vient logiquement de la façon dont je donne le chemin, mais comment procéder si je veux travailler sur le nom du fichier et non sur son contenu ?

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Il ne faut pas utiliser "cut". Ce programme agit sur un fichier. Donc évidemment, il regarde le contenu.

    De toute façon, bash est suffisant pour faire ce que tu veux faire.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ toto=/Users/moi/machin/truc/texmacs.sh                                                                              
    $ echo ${toto#*/}                                                                                                     
    Users/moi/machin/truc/texmacs.sh
    Et puis, pour utiliser une chaîne comme un fichier, tu peux utiliser les here-strings:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ cut -f2- -d/ <<<"$toto"
    Users/moi/machin/truc/texmacs.sh

  6. #6
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    bon

    j'ai pas encore regardé les <<< mais j'ai essayé le reste
    du coup maintenant je bloque sans comprendre pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    fichier=${1:?"Vous devez fournir un path"}
    tronquer="$fichier"
     
    while [ $tronquer != $tronquer_tampon ] do
       tronquer_tampon=$tronquer
       tronquer=${tronquer#*/}
    done
     
    echo $tronquer_tampon
    echo $tronquer
    le terminal me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unary operator expected
    d'un point de vue logique ça devrait marcher il me semble mais il y a un problème avec mon test de comparaison on dirait ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    mais pourquoi toutes ces variables intermédiaires ?!
    pourquoi cette boucle ??
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ficAbsPath="/chemin/fichier"
    ficName="${ficAbsPath##*/}"
    c'est tout.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/11/2016, 16h02
  2. [Batch] Récuperation nom et contenu de fichier texte
    Par garfield1701 dans le forum Scripts/Batch
    Réponses: 18
    Dernier message: 09/02/2016, 11h08
  3. [Débutant] Copier contenu de fichiers texte dans un fichier recap
    Par GuillaumeNcy dans le forum Visual Studio
    Réponses: 2
    Dernier message: 21/10/2013, 23h25
  4. [XL-2010] Enregistrement PDF avec pour nom de fichier le contenu d'une cellule.
    Par Julzz dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/01/2012, 11h46
  5. Lecture nom et contenu dans fichier
    Par Tempotpo dans le forum Langage
    Réponses: 2
    Dernier message: 19/05/2006, 14h11

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