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 :

Aide script shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 57
    Par défaut Aide script shell
    Bonjour,

    J'aurais besoin d'un petit peu d'aide car je dois réaliser un script shell. Cependant, je n'en ais jamais fait!!

    Ce script doit :
    - Copier un fichier dans un autre répertoire
    - Recopie celui-ci dans un autre fichier (nomFichier+date et heure de la copie) en supprimant les sauts de ligne
    - vide le fichier d'origine

    Voici ce que j'ai fait pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #Récupération du fichier à copier
    FICHIER_ORIGINAL = "/apps/webservers/dev3/getex/params/cre/fichier_creMIB.txt"
     
    #Récupération de la date et de l'heure
    DATE_DU_JOUR = 'date +%D%X'
     
    #Copie du fichier vers un autre répertoire
    cp FICHIER_ORIGINAL /apps/webservers/dev3/getex/params/creSave/fichier_creMIB$DATE_DU_JOUR.txt 
     
    #Récupération du fichier recopié
    FICHIER_RECOPIE = "/apps/webservers/dev3/getex/params/creSave/fichier_creMIB$DATE_DU_JOUR.txt"
     
    #Substituer les fins de ligne par des espaces
    sed 's/\n/ /' $FICHIER_RECOPIE

  2. #2
    Membre éprouvé Avatar de Levi59
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2011
    Messages : 58
    Par défaut
    Pour vider un fichier, une simple commande suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo > /chemin/vers/fichier

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 57
    Par défaut
    Citation Envoyé par Levi59 Voir le message
    Pour vider un fichier, une simple commande suffit :
    echo > /chemin/vers/fichier
    Ok merci je vais regarder ça.

    Et y a-t'il un moyen de vérifier que les actions faites avant de vider le fichier se sont bien déroulées?

    Car dans mon cas, si la copie a eu un problème, je ne dois pas vider le fichier!
    Et un autre petit problème je pense, la commande "sed" ne modifie pas le fichier mais affiche uniquement le résultat?!
    Comment faire pour que le fichier soit modifié ?

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    1) Il ne faut pas d'espace autour du = pour les affectations
    2) Pour récupérer la sortie d'une commande, c'est `command` et pas 'command'
    3) Pour récupérer la valeur d'une variable, il faut mettre un $ : $FICHIER_ORIGINAL et pas FICHIER_ORIGINAL
    4) sed ne vas pas modifier le fichier que tu passes en argument. Il se contente de le lire, de faire le traitement demandé, et d'envoyer le texte modifié sur sa sortie standard. Pour modifier un fichier il faut soit que tu utilises le flag -i (qui n'est pas standard), soit que tu lises un fichier et que tu rediriges la sortie dans un autre fichier (sed '...' input_file > output_file).
    5) Ton expression sed n'est pas correcte. Utilises plutôt tr (tr '\n' ' ' < input_file > output_file)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 57
    Par défaut
    Merci pour toutes ces infos!

    Je viens de modifier mon shell :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #Vérification de l'existence du répertoire de destination des Cre sauvegardés
    #Si le répertoire existeon ne fait rien
    #Si le répertoire n'existe pas on le creer
    if ! test -d /apps/webservers/dev3/getex/params/creSave
    then
    	mkdir /apps/webservers/dev3/getex/params/creSave
    	chmod 777 /apps/webservers/dev3/getex/params/creSave
    fi
     
    #Récupération du fichier à copier
    FICHIER_ORIGINAL="/apps/webservers/dev3/getex/params/cre/fichier_creMIB"
     
    #Récupération de la date
    DATE_DU_JOUR=`date +%d%m%Y`
     
    #Récupération de l'heure
    HEURE_DU_JOUR=`date +%X`
     
    #Copie du fichier vers un autre répertoire
    cp $FICHIER_ORIGINAL /apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR 
     
    #Récupération du fichier recopié
    FICHIER_RECOPIE = "/apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR"
     
    #Substituer les fins de ligne par des espaces
    #sed `tr '\n'''` $FICHIER_RECOPIE $FICHIER_RECOPIE
    tr '\n' '' $FICHIER_RECOPIE $FICHIER_RECOPIE
     
    #Suppression du contenu du fichier
    echo > /apps/webservers/dev3/getex/params/cre/fichier_creMIB
    J'ai de gros doutes au niveau de la commande cp sur la fin où je concatène avec la date et l'heure!!

    Si il y a un problème lors du traitement de la copie ou autre est-ce que le echo sera tout de même exécuté ou pas ?

    Et au niveau de la commande sed étant donné que je veux modifier le fichier est-ce possible de diriger la sortie du sed vers le fichier d'origine afin qu'il écrase ou pas ?

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Ton cp a l'air bon.

    Non, tu ne peux pas modifier le fichier que tu es en train de lire. Dans ton cas puisque tu as de toute façon besoin de copier le fichier, je te suggère de faire les traitements donc tu as besoin pendant la copie, avec par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/tr '\n' '' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE
    Dans ce cas tu n'as évidemment plus besoin du cp.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 57
    Par défaut
    Merci pour ton info.

    J'ai encore un problème, quand je prends le fichier que je veux traiter sous notepad, en fin de ligne je vois les caractères de saut de ligne : CR LF

    Dans mon code j'ai essayer d'enlever \n et aussi \r\n. Cependant, les sauts de ligne sont toujours présents !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/tr '\r\n' '' < $FICHIER_ORIGINAL > /apps/webservers/dev3/getex/params/creSave/fichier_creMIB-$DATE_DU_JOUR-$HEURE_DU_JOUR

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    Non, tu ne peux pas modifier le fichier que tu es en train de lire.
    Salut

    En fait, on peut utiliser une astuce pour lire et modifier un même fichier sans passer par un fichier intermédiaire. Il faut pour cela passer par les canaux numérotés.
    On crée un canal numéroté correspondant au fichier à traiter puis on lit ce canal et on redirige le travail dans le fichier à traiter. Exemple:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<fichier_a_traiter
    rm -f fichier_a_traiter
    traitement 0<&3 >fichier_a_traiter

    Le rm est toutefois obligatoire afin de dissocier, dans le SDF, l'ancien fichier du nouveau fichier. Si on ne le fait pas, la redirection commencera par vider l'ancien fichier. Et le canal n° 3 relié à ce fichier ne contiendra plus rien. C'est donc une procédure "sans filet" (en cas d'interruption malencontreuse du processus, perte totale du fichier quoi). Mis à part ce soucis, aucun pb. J'ai pu gérer de cette façon des fichiers allant jusqu'au G sans perte. Le système tient la charge...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    C'est pratique en effet, mais dans ce cas on n'écrit justement pas dans le fichier qu'on est en train de lire. On écrit dans un nouveau fichier (nouvel inode), qui a le même nom que le fichier qu'on vient d'effacer (mais qui existe toujours sous l'inode original, jusqu'à ce qu'on ferme le fd 3).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 57
    Par défaut
    Merci à tous pour votre aide.
    En tout cas mon problème est résolu par la commande suivante pour supprimer les saut de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr -d '\n' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 811
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 811
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    C'est pratique en effet, mais dans ce cas on n'écrit justement pas dans le fichier qu'on est en train de lire. On écrit dans un nouveau fichier (nouvel inode), qui a le même nom que le fichier qu'on vient d'effacer (mais qui existe toujours sous l'inode original, jusqu'à ce qu'on ferme le fd 3).
    C'est vrai que strictement parlant, ce n'est pas le "même" fichier. Là, je ne peux rien dire.

    Toutefois, j'ai aussi une astuce permettant de modifier un "même" fichier. En passant par vi ou ed en ayant redirigé les entrées à partir du script.

    Exemple: ouvrir fic, aller en ligne 100, ajouter "coucou"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vi fic << _EOT_ 1>/dev/null
    :100
    ocoucou[^ESC
    :wq
    _EOT_

    Bon, c'est lourd, fastidieux, pas pérenne... mais ça fonctionne

    Citation Envoyé par benjibul Voir le message
    Merci à tous pour votre aide.
    En tout cas mon problème est résolu par la commande suivante pour supprimer les saut de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tr -d '\n' < $FICHIER_ORIGINAL > $FICHIER_RECOPIE
    Accessoirement, le echo >$fichier_original est inutile. Tu peux mettre directement >$fichier_original. Ca le vide pareil et ça évite d'appeler une commande "echo" pour rien
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [aide script shell] renommage de repertoire / sous repertoire / fichier
    Par Smoki dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 05/01/2011, 17h58
  2. aide script shell
    Par ach152 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 10/06/2008, 21h14
  3. Aide script shell unix, creation utilisateur
    Par jazzparadise dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/05/2007, 12h25
  4. Besoin d'aide pour un script shell
    Par lecharcutierdelinux dans le forum Linux
    Réponses: 5
    Dernier message: 20/05/2006, 10h36

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