Sofistikovanější výpis seznamu databází pro použití v bashi
Pro zjednodušení života jsem si napsal jednoduchý skriptík, který vrací seznam databází na serveru. Parametry jako např. pouze nesystémové databáze, maska, pouze db daného vlastníka určují obsah.
#!/bin/sh
quoted=0
dbname="AND true"
user="AND true "
while getopts ":qsSp:D:h:u:" options; do
case $options in
p ) port="-p $OPTARG";;
q ) quoted=1;;
s ) user=" $user AND datdba = (select usesysid from pg_user where usename = 'postgres') ";;
S ) user=" $user AND datdba <> (select usesysid from pg_user where usename = 'postgres') ";;
D ) dbname=" $dbname AND datname <> '$OPTARG' ";;
h ) host="-h $OPTARG";;
u ) user=" $user AND datdba = (SELECT usesysid from pg_user where usename = '$OPTARG') ";;
\? )
echo "listdb list available databases.
Usage:
listdb [OPTIONS]... [masks]...
Options controlling the output content:
-s show system databases
-S show user's databases
-D DATABASE exclude database
-q quote output
-u USERNAME show only databases that owns user
Connection options:
-h HOSTNAME database server host or socket directory (default: \"local socket\")
-p PORT database server port (default: \"5432\")
Mask should contain wild chars like \"%\"."
exit 1
;;
: )
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
* ) echo $OPTARG;;
esac
done
ldbname=" false "
for p in ${@:$OPTIND}
do
ldbname="$ldbname OR datname LIKE '$p' "
done
if [[ "$ldbname" == " false " ]]
then
ldbname=true
fi
wherec="where true $user $dbname AND ( $ldbname )"
for db in `psql $port $host -A -t -l -c "select datname, quote_literal(datname) from pg_database $wherec" postgres`
do
BIFS=$IFS
IFS="|"
dbn=($db)
echo ${dbn[$quoted]}
IFS=$BIFS
done;
Příklady užití:
[pavel@localhost ~]$ ./listdb -p 5483 -q 'template1' 'template0' 'postgres' 'omega' [pavel@localhost ~]$ ./listdb -p 5483 -q -S 'omega' [pavel@localhost ~]$ ./listdb -p 5483 -q o% p% 'postgres' 'omega' [pavel@localhost ~]$ ./listdb -p 5483 o% p% postgres omega [pavel@localhost ~]$