Pages : 1
#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
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
#!/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...
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
Pages : 1