Created
April 9, 2015 13:39
-
-
Save hendrikb/10fd950a223939b6e6dd to your computer and use it in GitHub Desktop.
jsonify turns command line arguments into full featured JSON documents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# This tool turns command line arguments into full featured JSON documents | |
# author: Hendrik Bergunde <[email protected]> https://gist.github.com/hendrikb/ | |
# Call jsonify --help for help | |
# Put this script somewhere into your $PATH variable to access it from anywhere | |
# Thanks for using this script - I love you all. | |
# useful functions | |
function usage() { | |
echo 'jsonify <--[json-key-name] [json value] ... | OPTIONS>' | |
echo | |
echo ' jsonify takes --command-line-arguments and values and renders them as' | |
echo ' a JSON document. :)' | |
echo | |
echo ' You need at least one pair of --json-key-name json-value which then' | |
echo " will be rendered into {'json-key-name': 'json-value'} " | |
echo | |
echo 'Options:' | |
echo ' -p pretty print the output' | |
echo " -t add @timestamp field in the format `date '+%FT%R:%S%:z'`" | |
echo ' -h show this help' | |
} | |
function fail() { | |
echo $1 1>&2 | |
echo | |
exit $2 | |
} | |
function argument_to_key() { | |
echo $1 | sed -e 's/^--//' | |
} | |
function parse_flag() { | |
echo $1 | sed -e 's/^-//' | |
} | |
function print() { | |
if [ $PRETTY == true ] ; then | |
echo $@ | |
else | |
echo -n $@ | |
fi | |
} | |
###### Validation of Arguments ######## | |
if [ "$1" == "--help" ] || [ "$1" == "-h" ] ; then usage ; exit 0 ; fi | |
if [ -z "$1" ] || [ -z "$2" ] ; then fail 'You need at least two parameters!' 1 ; fi | |
if [[ $1 =~ ^[a-z] ]] ; then fail 'You need to specify at least one --argument' 2; fi | |
SHOW_TIMESTAMP=false | |
PRETTY=false | |
###### Parsing of Arguments ######## | |
JSON_KEY_VALUES=() | |
while [ ! -z "$1" ] ; do | |
if [[ $1 =~ ^--.+ ]] ; then | |
if [[ $1 =~ = ]] ; then fail "Sorry, we do not support --keyname=value notation. Please use --keyname value :)" 4 ; fi | |
if [ -z "$2" ] ; then fail "Missing value argument for $1 - aborting" 3 ; fi | |
JSON_KEY_VALUES+=("\"`argument_to_key $1`\": \"$2\"") | |
shift 2 | |
else | |
if [[ $1 =~ ^-.+ ]] ; then | |
flag=`parse_flag $1` | |
if [ "$flag" == "p" ] ; then PRETTY=true ; fi | |
if [ "$flag" == "t" ] ; then SHOW_TIMESTAMP=true ; fi | |
shift 1 | |
else | |
fail "Don't know what to do with argument \"$1\" - please call for --help" 99 ; | |
fi | |
fi | |
done | |
###### Output ######## | |
TIMESTAMP=`date "+%FT%R:%S%:z"` | |
i=0 | |
print '{' | |
for row in "${JSON_KEY_VALUES[@]}" | |
do | |
if [ $PRETTY == true ] ; then echo -en "\t" ; fi | |
echo -n $row | |
i=$((i+1)) | |
if [ ! $i -eq ${#JSON_KEY_VALUES[@]} ] || [ $SHOW_TIMESTAMP == true ] ; then echo -n ', ' ; fi | |
if [ $PRETTY == true ] ; then echo; fi | |
done | |
if [ $SHOW_TIMESTAMP == true ] ; then | |
if [ $PRETTY == true ] ; then echo -en "\t" ; fi | |
echo -n "\"@timestamp\": \"$TIMESTAMP\"" | |
if [ $PRETTY == true ] ; then echo; fi | |
fi | |
echo '}' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment