
Här är ett exempel på hur BASH kan interagera med en databas.
Applikationen är en enkel telefonbok där det går att lägga till poster samt att söka bland dem.
Det är sqlite3 som används och för att köra exemplet måste du också ha dialog installerat.
| Code: |
~$ sudo aptitude install dialog sqlite3
|
BASH-koden kräver en databas som heter tel.db och den skapas såhär :
| Code: |
~$ sqlite3 tel.db
create table tel (id INTEGER PRIMARY KEY, namn TEXT, tel TEXT);
.quit
|
(Sqlite saknar funktionen AUTOINCREMENT, men inkrementerar 'id' automatiskt om det anges som NULL).
Gör sedan BASH-koden exekverbar (förutsätter att du sparat koden som 'tel.sh' :
| Code: |
~$ chmod u+x tel.sh
|
Starta programmet :
Koden är ganska löst skriven och saknar en del i gränsnittet samt i funktionalitet - bl. a. finns ingen funktion för att editera lagrade poster. Men det går utmärkt att bygga vidare på eller kanske skapa en helt annan databasdriven lösning.
| Code: |
#!/bin/bash
TMP=$(mktemp /tmp/tmp.XXXXXXXX)
DB=tel.db
function sp() {
dialog --inputbox "$1" 8 60 2>$TMP
RET=$?
PATT=$(cat $TMP)
}
# LÄGG TILL I ADRESSBOK
function add() {
sp 'Ange namn:'
# Hantera Cancel (gå till huvudmeny)
(($RET)) && break
NAMN=$PATT
sp 'Ange telefonnummer:'
TEL=$PATT
sqlite3 $DB "insert into tel values (NULL,'$NAMN','$TEL')"
dialog --msgbox "Tillagd:\n$NAMN: $TEL" 8 60
}
# SÖK I ADRESSBOK
function search() {
sp 'Ange sökterm:'
# Hantera Cancel (gå till huvudmeny)
(($RET)) && break
HITS=$(sqlite3 $DB \
"select * from tel where namn like '%$PATT%'" | \
tr ' ' '_')
pstr=""
for HIT in $HITS; do
HIT=$(echo $HIT | tr '|' ' '); HIT=($HIT)
ID=${HIT[0]}
NAMN=${HIT[1]}
TEL=${HIT[2]}
#pstr="$pstr $ID \"$NAMN $TEL\""
pstr="$pstr $ID \"$NAMN\""
done
dialog --menu 'Välj namn' 16 40 10 $pstr 2>$TMP
ID=$(cat $TMP)
HITS=$(sqlite3 $DB "select tel from tel where id = $ID")
dialog --msgbox "$HITS" 8 60
}
# huvudmeny
while [ 1 ]; do
dialog --menu 'Välj funktion' 16 40 10 \
1 'Sök i adressbok' \
2 'Lägg till i adressbok' 2>$TMP
# Hantera Cancel (avsluta)
(($?)) && exit
IDD=$(cat $TMP)
case $IDD in
1)
while [ 1 ]; do
search
done
;;
2)
while [ 1 ]; do
add
done
;;
esac
done
|
Inlägg ändrat av marwal, den 2007-08-05 18:34