Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/11/2013, à 21:40

Olivier_Dev

Dictionary en Bash

Bonsoir

Juste pour le fun, aujourd'hui je me suis demandé comment utiliser un dictionnaire en bash, j'ai cherché et trouver

declare -A 

, bon ouai j'ai pas trop kiffer tongue

je me suis amuser a imagine un petit bidule, un truc, une chose, bref amuser quoi.
L'idée c'est d'utiliser la puissance des dicos Python en Bash.

bon je sais, je suis pas en mesure de rivaliser avec les super-dev, mais bon entre deux pauses ça fais pas de mal de se faire plaisir.
Alors voilà l'idée, 2 fichiers, un service dbus avec les methodes et fonctions et un main appelant.

Le main appelant sera utiliser dans bash et le dbus renverra les infos souhaitées.
Bon je papotte pas plus et voici, les quelques debuts de codes:
Le service Dbus que j'ai nommé BashObject

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import dbus.service
import sys
import glib as GLib
from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)

class BashObject(object):
    __name__ = ""

class BusService(dbus.service.Object):
    # Dbus service
    def __init__(self, main_loop):
        self.object_dic = {}
        self.loop = main_loop
        bus_name = dbus.service.BusName('org.BashObject.listener', bus=dbus.SessionBus())
        dbus.service.Object.__init__(self, bus_name, '/org/BashObject/listener')
        print "service starting"
 
    @dbus.service.method('org.BashObject.listener')
    def create_object(self, name):
        if not name in self.object_dic:
            new_object = BashObject()
            new_object.__name__ = name

            self.object_dic[name] = new_object
        else:
            print "object already exist"

    @dbus.service.method('org.BashObject.listener')
    def add_to_object(self, name, key, value):
        try:
            self.object_dic[name].__dict__[key] = value
        except KeyError:
            return ""

    @dbus.service.method('org.BashObject.listener')
    def get_value(self, name, key):
        try:
            return self.object_dic[name].__dict__[key]
        except KeyError:
            return ""

    @dbus.service.method('org.BashObject.listener')
    def list_objects(self):
        print "here"
        liste = ""
        for elem in self.object_dic:
            liste = liste + "\n" +self.object_dic[elem].__name__
            for key in self.object_dic[elem].__dict__:
                liste = liste + "\n" + "--" + key + ":" + self.object_dic[elem].__dict__[key]
        return liste

main_loop = GLib.MainLoop()
service = BusService(main_loop)
main_loop.run()

Le main appelant que j'ai nommé BashObject_Sender

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import dbus
import sys

bus = dbus.SessionBus()
bus_service = bus.get_object('org.BashObject.listener', '/org/BashObject/listener')


if "--get-value" in sys.argv:
    name = sys.argv[2]
    key = sys.argv[3]
    dbus_send = bus_service.get_dbus_method('get_value', 'org.BashObject.listener')
    r=dbus_send(name, key)
    print r

if "--create-dic" in sys.argv:
    name = sys.argv[2]
    dbus_send = bus_service.get_dbus_method('create_object', 'org.BashObject.listener')
    dbus_send(name)

if "--del-dic" in sys.argv:
    name = sys.argv[2]
    dbus_send = bus_service.get_dbus_method('del_object', 'org.BashObject.listener')
    dbus_send(name)

if "--add-key" in sys.argv:
    name = sys.argv[2]
    key = sys.argv[3]
    value = sys.argv[4]
    dbus_send = bus_service.get_dbus_method('add_to_object', 'org.BashObject.listener')
    dbus_send(name, key, value)

if "--remove-key" in sys.argv:
    name = sys.argv[2]
    key = sys.argv[3]
    value = sys.argv[4]
    dbus_send = bus_service.get_dbus_method('add_to_object', 'org.BashObject.listener')
    dbus_send(name, key, value)

if "--list-dic" in sys.argv:
    dbus_send = bus_service.get_dbus_method('list_objects', 'org.BashObject.listener')
    liste = dbus_send()
    print liste

if "--count-dic" in sys.argv:
    dbus_send = bus_service.get_dbus_method('list_objects', 'org.BashObject.listener')
    liste = dbus_send()
    print liste

et un code d'utilisation, simple je le conçois big_smile

#!/bin/bash

echo "Start BashObject..."
./BashObject &
pid=$!
echo "BashObject processing : " $pid
sleep 2
for elem in 1 2 3 4 5;
do
    ./BashObject_Sender --create-dic Person$elem
        ./BashObject_Sender --add-key Person$elem Age ""
        ./BashObject_Sender --add-key Person$elem Sexe ""
        ./BashObject_Sender --add-key Person$elem taille ""
        ./BashObject_Sender --add-key Person$elem Poid ""

done

./BashObject_Sender --add-key Person1 Age 38
./BashObject_Sender --add-key Person1 Sexe Homme
./BashObject_Sender --add-key Person1 taille 1.70
./BashObject_Sender --add-key Person1 Poid 70


if [ $(./BashObject_Sender --get-value Person1 Poid) -gt "70" ]
    then
        echo "houu il est gaillard."
    else
        echo "ben c'est maigrichon tout ça."
fi 
mes_elements=$(./BashObject_Sender --list-dic)

for i in $mes_elements
do
    echo $i
done
kill -15 $pid && echo "End."

Et la sortie :

Start BashObject...
BashObject processing :  3299
service starting
70
ben c'est maigrichon tout ça.
here
Person2
--__name__:Person2
--Age:
--Poid:
--Sexe:
--taille:
Person3
--__name__:Person3
--Age:
--Poid:
--Sexe:
--taille:
Person1
--__name__:Person1
--Age:38
--Poid:70
--Sexe:Homme
--taille:1.70
Person4
--__name__:Person4
--Age:
--Poid:
--Sexe:
--taille:
Person5
--__name__:Person5
--Age:
--Poid:
--Sexe:
--taille:
End.

Bon comprenez bien que je n'ai fais que mettre en avant une idée, et que ke me suis pas cassé le mou a savoir qui appel qui, comment proteger l'objet dbus ect...
avec un peu plus de temps on devrait avoir un petit truc carré.

Voili voilou, si vous avez des astuce du genre je suis preneur... wink

Hors ligne

#2 Le 26/11/2013, à 10:04

nicolas66

Re : Dictionary en Bash

Pour moi, ton post aurait plus sa place dans "Vos développements libres". Je laisse les autres réagir.


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne