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 :

Intégration d'un ART ASCII dans tous mes futurs script à l'aide d'un modèle


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut Intégration d'un ART ASCII dans tous mes futurs script à l'aide d'un modèle
    Bonjour, voici un cas plutôt épineux.
    L'idée est d'intégrer une sorte d'entête dans tous les futurs script SH .... une image parle mieux que des mots :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ##   // --------------------------------------------------------------- \\   ##
    ##   ||                                                                 ||   ##
    ##   ||         Script ...........................................      ||   ##
    ##   ||     ......................................................      ||   ##
    ##   ||     ......................................................      ||   ##
    ##   ||                                                                 ||   ##
    ##   \\ --------------------------------------------------------------- //   ##
    ##           ||                                                ||            ##
    ##           ||         Développeur : (Votre nom ici)	       ||            ##
    ##           ||  Version : 1.0                 Année : 2023    ||            ##
    ##           ||  Licence :                                     ||            ##
    ##           ||                                                ||            ##
    ##           \\ ---------------------------------------------- //            ##
    J'ai déjà réussi à recréer les différentes lignes (chacune contenue dans une chaîne puis sauvegardé comme élément d'un tableau).
    L'affichage est correcte à ce que j'attendai avec la commande "CAT".

    Mais dès que je veux enregistrer le tout dans le nouveau script ..... cela coince.
    Pour ce faire, j'utilise la redirection d'une commande vers un fichier ... et à partir de la ..... je perds mes espacement, qui serviront de centreur de contenu, (ces espacements sont constitué d'un ensemble de caractère espace). En clair au lieu d'avoir une dizaine d'espace à un endroit je me retrouve qu'avec un seul ... alors que la concaténation s'affiche correctement avec la commande ECHO.

    pour donner un exemple :
    Je code ma chaîne avec ceci : # # # # #
    Affichage avec echo : # # # # #
    Affichage avec CAT du fichier: # # # # #

    Bref sympa comme erreur.
    En cherchant un peu, j'ai trouvé un p'tit problème :
    Le script que je développe est sauvegardé sur un fichier avec encodage de caractères en UTF-8 (information vérifié avec la commande FILE -i MonFichier.sh).
    Par contre le nouveau fichier créé via la redirection d'ECHO, a un encodage US-ASCII .... est-ce que cela une incidence.

    De plus la conversion avec la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ICONV -f US-ASCII -t UTF-8 File_Input -o File_Ouput
    ne fait aucun effet, le fichier reste sous US-ASCII.

    L'environnement de travail est sous un RaspBerry, Installé en UTF-8 et sous BASH.

    Je vous joint un code edulcoré qui reproduit le défaut :

    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
    32
    33
    34
    35
     
    ## Déclaration du tableau :
    declare -a Tab_Header
     
    ## Déclaration des variables :
    Script_SH="./Result.sh"
    ## -- Initialisation des variables avec le code ASCII 
    Indent_1=$(echo -e "\x20\x20\x20")				## Tabulation
    Indent_2=$(echo -e "\x20")						## Espace
    Charac_A=$(echo -e "\x23\x23")  				## Character => 'dièse'
     
    ## Remplissage du tableau :
    Tab_Header[0]="#!/bin/bash"
    Tab_Header=("${Tab_Header[@]}" "-*- coding:Utf-8 -*-")
    Tab_Header=("${Tab_Header[@]}" "")
     
    ## -- Concaténation de la chaîne :
    String="${Charac_A}${Indent_2}${Indent_2}${Indent_2}${Charac_A}"
    String="${String}${Indent_2}${Charac_A}"
    String="${String}${Indent_2}${Charac_A}"
    String="${String}${Indent_2}${Indent_2}${Indent_2}${Charac_A}"
     
    ## Ajout de la nouvelle ligne dans le tableau :
    Tab_Header=("${Tab_Header[@]}" "${String}")
     
    ## Affichage à l'écran:
    echo "${String}"
     
    ## Sauvegarde du tableau dans le fichier : 
    for i in ${!Tab_Header[@]}
    do
    echo ${Tab_Header[$i]} >> $Script_SH
     
    ##echo "dans le tableau $i : ${tableau[$i]}"
    done
    Résultat attendu à l'affichage : (Carac #)(Espace)(Espace)(Espace)(Carac #)(Espace)(Carac #)(Espace)(Carac #)(Espace)(Espace)(Espace)(Carac #)

    DSL par avance pour les erreurs de débutants.
    Et merci pour votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 748
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 748
    Par défaut
    Citation Envoyé par totom7 Voir le message
    Par contre le nouveau fichier créé via la redirection d'ECHO, a un encodage US-ASCII .... est-ce que cela une incidence.
    Oui parce que ton script a des caractères non ASCII (des accents) donc en ASCII tu vas avoir 2 ou plusieurs caractères, et la ligne ne sera plus alignée

    d'après les Internets, il faut coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Indent_1="\x20\x20\x20" ## or export Indent_1="\x20\x20\x20"
    Indent_2="\x20"         ## or export Indent_2="\x20"
    Charac_A="\x23\x23"     ## or export Charac_A="\x23\x23"
     
    echo -e "${Charac_A}${Indent_2}${Indent_2}${Indent_2}${Charac_A}${Indent_1}${Indent_1}${Charac_A}${Indent_2}${Charac_A}${Indent_2}${Indent_2}${Indent_2}${Charac_A}"
    Citation Envoyé par totom7 Voir le message
    pour donner un exemple :
    Je code ma chaîne avec ceci : # # # # #
    Affichage avec echo : # # # # #
    Affichage avec CAT du fichier: # # # # #
    C'est très très clair tu as le même problème qu'avec bash, il faut sûrement quoter les exemples.

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 982
    Par défaut
    C'est ta boucle for qui merdoie.

    Avec les index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in ${!Tab_Header[@]}
    do
      echo "${Tab_Header[$i]}" >> $Script_SH
    done
    Sans les doubles quotes, les séries d'espaces sont interprétées comme des séparateurs d'éléments.

    ou sans index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for el in "${Tab_Header[@]}"
    do
      echo "$el" >> $Script_SH
    done
    Si tu ne places pas ton tableau entre double quote, tes séries d'espaces seront vues comme les séparateurs des éléments sur lesquels for doit boucler.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par totom7 Voir le message
    DSL par avance pour les erreurs de débutants.
    Tu ne trouves pas ton "en-tête" trop grandiose pour un script shell? Tu n'es pas en train de construire un tombeau de pharaon, tu écris juste un script shell, c'est à dire un truc qui va sauvegarder tes bdd, récupérer des infos dans les paquets installés, activer/désactiver le ping (je prends là exemple de mes propres scripts shell).
    Et mettre une "licence" sur un script shell... à quoi tu penses comme licence possible pour un truc par nature lisible par tous?
    En plus, quand il faut remplir les infos cela décale la fin du cartouche donc ça va être bien chiant à remplir

    Je ne dis pas que l'idée est mauvaise, mais je pense que tu te laisses emporter par des rêves de grandeur Tiens voici un exemple de mes en-têtes dans mes scripts shell...
    Code bash : 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
    #!/usr/bin/env bash
     
    # Programme récupérant le contenu des iso Linux
    # Auteur: xxx xxx (xxx@xxx)
     
    # Usage prog [-m mnt, --mount=mnt] iso [...]
    #	Option -m mnt, --mount=mnt: Utilisation du dossier "mnt" comme point de montage
     
    #set -x			# Debugging
    set -u			# Appel d'une variable non créée provoque une erreur
     
    # Fonction qui affiche l'usage du programme
    usage() {
    	echo "Usage: $(basename $0) [-m mnt, --mount=mnt] iso [...]"
    }
     
    # Récuperation des options
    ...
    Valà. Pas besoin de mettre l'année, la version, la licence, la date de réservation, le prix, l'âge du codeur, etc etc...
    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]

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 287
    Par défaut
    bonjour

    Pas tout compris à ton code, un simple modèle avec chercher/remplacer dans ce style

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    modele=$(cat << 'EOF'
    #!/usr/bin/env bash
    ##   // --------------------------------------------------------------- \\   ##
    ##   ||                                                                 ||   ##
    ##   ||     _      ||   ##
    ##   ||     _      ||   ##
    ##   ||     _      ||   ##
    ##   ||                                                                 ||   ##
    ##   \\ --------------------------------------------------------------- //   ##
    ##           ||                                                ||            ##
    ##           ||         Développeur : ______________________   ||            ##
    ##           ||  Version : _________           Année : ____    ||            ##
    ##           ||  Licence :                                     ||            ##
    ##           ||                                                ||            ##
    ##           \\ ---------------------------------------------- //            ##
    EOF
    )
     
    monPrintf() {
      # pour bien gérer les accents
      text="$1"
      declare -i width="$2"
      while [[ ${#text} -lt $width ]]; do
        text="$text "
      done
      echo -n "$text"
    }
     
    version="0.0.1"  # $1
    annee="2024"
    dev="Pierre Pâques" 
    #TODO avoir une fonction wrap pour créer le tableau textes
    textes=('    bonjour', 'le monde par ce bel été', 'Merçi')
     
    entete="$modele"
    # ordre compte pas, ici, le "regex" peut être partout le même caractère pour tous les champs
    for txt in "${textes[@]}"; do
        entete=${entete/'_'/$(monPrintf "$txt" 54)}
    done
    entete=${entete/'______________________'/$(monPrintf "$dev" 22)}
    entete=${entete/'_________'/$(printf "%-9s" "$version")}
    entete=${entete/'____'/$(printf "%-4s" "$annee")}
     
    echo "$modele"
    echo "->"
    echo "$entete"  # > fichier.sh
    Et bien sûr, on peut utiliser le modèle de Sve@r sans changement de code

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Par défaut
    Bonjour, je viens de tester la solution de CosmoKnacki .... et cela fonctionne ..... merci beaucoup.

    Et je tenais a remercier vous trois pour votre aide et votre célérité ... en tout cas en vous lisant, je me suis rendu compte du chemin qu'il me reste à parcourir.
    Et j'avoue, à la lecture de vos scripts, j'ai fabriqué une vraie usine à gaz ... bref je vais potasser tout cela pour rendre mon script moins gourmand.

    Merci à tous

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par totom7 Voir le message
    Bonjour, je viens de tester la solution de CosmoKnacki .... et cela fonctionne ..... merci beaucoup.
    C'est vrai que j'ai pas fait attention à ton script car je me concentrais sur ton en-tête... mais CosmoKnacki a donné une très bonne info: il faut toujours encadrer ses variables strings de double quotes, sinon, si elles contiennent des caractères spécifiques shell (comme espace par exemple), alors le shell les prend pour lui et non pas pour du contenu de variable
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data=$(ls -l)
    echo $data
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    data=$(ls -l)
    echo "$data"
    Et c'est encore pire quand on les évalue => if test $data = "truc" car si $data est vide, le shell ne verra rien à comparer avec "truc" et renverra une erreur de syntaxe => à remplacer par if test "$data" = "truc"...
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    et encore, là, le shell braille, mais sur test -n $var, il renverra toujours vrai même si la variable n'existe pas, parce que "-n" sera considérée comme une chaîne et existe effectivement.
    .
    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. [Toutes versions] Pouvoir utiliser une fonction dans tous mes classeurs Excel
    Par SylvainM dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/03/2014, 21h10
  2. Dans tous mes états !
    Par galact dans le forum IHM
    Réponses: 5
    Dernier message: 21/09/2010, 14h51
  3. [AC-2003] Variable utilisée dans tous mes formulaires
    Par gentoo dans le forum IHM
    Réponses: 2
    Dernier message: 18/05/2009, 11h33
  4. Rechercher un mot dans tous mes documents
    Par rom5656 dans le forum VBA Word
    Réponses: 18
    Dernier message: 02/09/2008, 11h43
  5. Réponses: 2
    Dernier message: 09/05/2008, 17h38

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