Skip to content

Instantly share code, notes, and snippets.

@eenchev
Last active November 26, 2019 18:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eenchev/350a61fc8dd06ebf84b2463a3006eb28 to your computer and use it in GitHub Desktop.
Save eenchev/350a61fc8dd06ebf84b2463a3006eb28 to your computer and use it in GitHub Desktop.
#!/bin/bash
#### Constants
USAGE="Usage: $(basename "$0") (-d/--database NAME) [GET/SET] [KEY-NAME] [VALUE] -- simple key-value storage implemented in bash"
DEFAULT_DB_NAME=0
#### Functions
print_usage() {
echo "$USAGE"
}
set_database_name() {
if [ -z "$1" ]
then
print_usage
return 1
fi
DB_NAME=$1
}
get_value_by_key() {
if [ -z "$1" ]
then
print_usage
return 1
fi
grep "^$1=" $DB_TEMPFILE | awk -F= '{print $2}'
}
set_value_at_key() {
if [ -z "$1" ] || [ -z "$2" ]
then
print_usage
return 1
fi
grep -q "^\($1\s*=\s*\).*\$" "$DB_TEMPFILE" \
&& sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" "$DB_TEMPFILE" \
|| echo "$1=$2" >> "$DB_TEMPFILE" \
&& echo $2
}
#### Main
case "$1" in
-db|--database)
set_database_name $2
shift 2
;;
*)
set_database_name $DEFAULT_DB_NAME
esac
DB_TEMPFILE=/tmp/kval/$DB_NAME.db
if [ ! -f $DB_TEMPFILE ]
then
mkdir -p /tmp/kval
touch $DB_TEMPFILE
fi
case "$1" in
GET) get_value_by_key "$2"
exit 0
;;
SET) set_value_at_key "$2" "$3"
exit 0
;;
*) print_usage
exit 1
;;
esac
@eenchev
Copy link
Author

eenchev commented Nov 26, 2019

./kval.sh SET one 1
./kval.sh GET one

Additionally, you can explicitly specify database to be used:
./kval.sh -db colors SET red 0xFF0000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment