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

  1. #1
    Invité
    Invité(e)
    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 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    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
    Invité
    Invité(e)
    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 !

  4. #4
    Invité
    Invité(e)
    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 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    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
    Invité
    Invité(e)
    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
    Invité
    Invité(e)
    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.

  8. #8
    Invité
    Invité(e)
    Par défaut
    pourquoi, pourquoi je me demande bien aussi quand je vois l'efficacité de ta commande

    effectivement c'est tellement plus radical

    mais dis moi, aurais tu une instruction pour le contraire :

    là, avec truc/machin/chose/texmacs.sh ton instruction me renvoie texmacs.sh, soit le nom du fichier

    et pour avoir truc/machin/chose/, soit le chemin sans le nom, y a til un raccourci similaire ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ficAbsPath="/chemin/fichier"
    absPath="${ficAbsPath%/*}"
    RTFM: Parameter expansion

  10. #10
    Invité
    Invité(e)
    Par défaut
    merci vraiment c'est parfait
    je vais travailler à mon script maintenant et me pencher sur la documentation sur RTFM
    je reviendrai si j'ai un autre souci dans la suite du script...
    Vincent

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 307
    Par défaut
    RTFM veut dire "Read The Fucking Manual". = "Lis Le Putain de Mode d'emploi".

    Un simple man bash donne accès à ce texte.

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par elodouwen Voir le message
    là, avec truc/machin/chose/texmacs.sh ton instruction me renvoie texmacs.sh, soit le nom du fichier

    et pour avoir truc/machin/chose/, soit le chemin sans le nom, y a til un raccourci similaire ?
    Dans le temps (avant le bash, peut-être), on utilisait basename et dirname:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ foo=/truc/machin/chose/texmacs.sh
     
    $ dirname "$foo"
    /truc/machin/chose
     
    $ basename "$foo"
    texmacs.sh
    avec évaluation pour stocker dans une variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foo=/truc/machin/chose/texmacs.sh
    d=$(dirname "$foo")
    f=$(basename "$foo")
    echo "$d -> $f"
    => /truc/machin/chose -> texmacs.sh
    Je trouve cette solution plus facile à lire pour un débutant, mais les expansions de paramètre (avec "%/*" pour enlever tout ce qui suit le dernier "/" et "##*/" pour enlever tout ce qui précède le dernier "/"), proposées par les spécialistes, font plus professionnelles!

+ 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