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 :

Variable persistante (bash, sed)


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut Variable persistante (bash, sed)
    Un petit truc pour rendre une variable (numérique) persistante pour un script.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    Persist()	{	# 1:Expression like VARIABLE=Value (numeric)
    	local V=${1%=*}
    	eval "$1"
    	sed -i "s/^$V=[0-9][0-9]*/$1/" $0 || return 1
    }
    Et l'utilisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # BEGIN
    AA=12
    read -p "Entrez une valeur : " NEW_AA
    # je passe la vérification de valeur numérique ...
    [ $NEW_AA != $AA ] && Persist AA=$NEW_AA
    Et le tour est joué
    Maintenant, pour les spécialistes des expressions régulières et de sed : S'il y a des propositions pour étendre ça aux autres types de variables, ce sera bienvenu

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Voilà une proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Persist()	{	# 1:Expression like VARIABLE=Value (numeric)
    	local V=${1%=*}
    	eval "$1"
    	sed -i "s/^$V=.[^ ]*/$1/" $0 || return 1
    }

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    euh...

    export


    tout simplement...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    euh...
    export
    tout simplement...
    Mais cela n'exporte que dans l'environnement du script actif. C'est perdu après un exit.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Mais cela n'exporte que dans l'environnement du script actif. C'est perdu après un exit.
    euh non..

    C'est valable durant la durée de vie de l'environnement, pas du script...


    Exemple :

    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
     
    ###!/bin/ksh
     
    A=`uname`
     
    if [ $A =  "ULTRIX" ]
    	then export MACHINE=mips
    elif  [ $A =  "SunOS" ]
    	then export MACHINE=sparc
    elif  [ $A =  "HP-UX" ]
    	then export MACHINE=HP-UX
    elif  [ $A =  "Linux" ]
        then export MACHINE=i386
    elif  [ $A =  "CYGWIN_NT-5.1" ]
        then export MACHINE=win
    else
        echo "Error: unknown machine"
    fi ;
    A la sortie de ce script, la variable d'environnement MACHINE est settée...


    Tant que le shell existe, cette varaible existe...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Sur un terminal je lance un script 'test.sh' contenant ces lignes --> je ne retrouve pas la variable dans l'environnement de mon terminal.
    Si j'ajoute une commande env à la fin de mon script c'est OK, je vois la variable.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Les variables exportées se transmettent aux enfants, donc pas au shell dans lequel tu exécutes le script.

    Par contre, si tu lances un xterm à la fin du script de Souviron, les variables exportées seront alors accessibles, mais uniquement dans le xterm lancé par le script, pas dans celui à partir duquel tu as lancé le script.

    Pour que les variables exportées d'un script soient accessibles dans le shell depuis lequel est lancé le script et ses enfants, il faut sourcer le-dit script dans le shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    . ./test.sh
    # ou
    source test.sh
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    De toutes façons, l'objet de ma fonction est de conserver la valeur même après un reboot

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    fallait le dire, et ce n'est pas ce que dis ton PO..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Un poil plus simple ?
    Hello,

    Merci de l'astuce pour persister une variable. J'avais juste un poil plus simple à proposer (enfin par plus simple, j'entends "sans utiliser de sed dans une fonction").

    Ca pourrait se faire avec un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/bash
     
    # je declare mon fichier de persistance
    FICHIER_PERSISTANT=mon_fichier_de_persistance
     
    # j'exporte ma variable
    export MAVARIABLE=chose
     
    # je la persiste
    export -p >>$FICHIER_PERSISTANT

    Mon fichier de persistance ressemble alors à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    declare -x MAVARIABLE="chose"
    Ca marche avec tous les types de variables (avec les tableaux aussi, on aura juste un declare -ax au lieu de -x dans le fichier de sortie)

    Il ne reste plus qu'à sourcer le fichier de persistance si on veut réutiliser la variable en question.

    On peut aussi persister des fonctions de la même façon, sauf qu'il faudra exporter sa fonction avec export -f <nom_de_la_fonction> et la persister avec un export -f >>lefichier


    Deupac.

  11. #11
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    C'est une possibilité, j'utilise aussi le source pour des valeurs et des fonctions partagées.
    Je trouvais que l'avantage de ma fonction était de mosifier le script lui-même sans utiliser d'autre fichier.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    En effet, j'ai trouvé assez malin de ta part le fait de modifier le fichier lui-même. Après, pour choisir entre ta version et la mienne, c'est le besoin qui fera la différence

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 15
    Points : 2
    Points
    2
    Par défaut Variable persistante entre deux exécutions d'un shell
    Ce post traite de la conservation des valeurs de variables entre 2 exécutions d'un shell.

    Le principe est : lors de l'exécution d'un shell on affecte à une variable la valeur "ABCD" ; et au début de l'exécution suivante, cette variable vaut encore "ABCD".

    Cette technique est localisée au shell : elle n'utilise aucun élément externe au shell. Elle évite par exemple d'avoir à utiliser un fichier de sauvegarde distinct, qu'il faudrait écrire puis relire.

    L'exemple concerne les saisies : lors d'un première exécution, la valeur saisie par l'utilisateur est rendue persistante. A l'exécution suivante, cette valeur est proposée comme valeur par défaut pour la saisie.

    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
     
    # ******************************************************************************************
    # Description : Saisie persistante d'une variable dans un shell
    #               La valeur saisie est conservee entre 2 lancements du shell
    #               Elle est conservee directement dans le shell (pas de fichier annexe)
    #               La valeur saisie est proposee par defaut lors de la saisie suivante
    # Auteur      : JLCAT
    # ******************************************************************************************
     
    # Fonction de saisie - $1 : invite de saisie, $2 : nomvar
    # -------------------------------------------------------
     
    saisie () {
    	nomvar=$2 ; eval valvar=\$$nomvar
    	echo -n "$1 (defaut=$valvar) : " ; read newval
    	if [ "$newval" != "" ] ; then
    		awk -v newval="$newval" -v nomvar="$nomvar" -v q='"' '{print (substr($0,1,length(nomvar)+1)==nomvar "=") ? nomvar "=" q newval q : $0}' $0 >$0.new ; chmod 777 $0.new ; mv $0.new $0
    		eval $nomvar="\"$newval\""
    	fi
    	}
     
    # Programme de test
    # -----------------
     
    nomAuteur="Marcel Duchamp"
    saisie "Nom de l'auteur" nomAuteur

Discussions similaires

  1. Variable persistante dans un partialLoop() ?
    Par Samsawell dans le forum Zend Framework
    Réponses: 0
    Dernier message: 04/04/2011, 11h18
  2. script bash SED
    Par alex_2009 dans le forum Linux
    Réponses: 5
    Dernier message: 22/06/2009, 04h22
  3. Lecture de variable (programmation bash)
    Par anarchy_for_espa dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 22/02/2008, 10h58
  4. [Dates] Variable persistante à arrêter!
    Par godjojo dans le forum Langage
    Réponses: 7
    Dernier message: 20/05/2007, 19h12
  5. probleme de récupération de variable en bash avec awk
    Par avogadro dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/12/2006, 01h31

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