Skip to content

Instantly share code, notes, and snippets.

@jabes
Last active February 9, 2021 16:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jabes/c00b322d88a3be7fcc1b4898b4d785ee to your computer and use it in GitHub Desktop.
Save jabes/c00b322d88a3be7fcc1b4898b4d785ee to your computer and use it in GitHub Desktop.
Some Bash Functions
#!/bin/bash
function get_rand {
echo "$(date +%s)"
}
function is_empty {
if [[ -z "$1" ]]; then echo 1; else echo 0; fi
}
function is_array {
local REF=$1
local ARGUMENTS=""
ARGUMENTS=$(declare -p ${REF} 2>/dev/null)
if [[ ${ARGUMENTS} =~ "declare -a" ]]; then echo 1; else echo 0; fi
}
function is_assoc_array {
local REF=$1
local ARGUMENTS=""
ARGUMENTS=$(declare -p ${REF} 2>/dev/null)
if [[ ${ARGUMENTS} =~ "declare -A" ]]; then echo 1; else echo 0; fi
}
function array_total {
local VALUES=$1
IFS=' ' read -a ARRAY <<< "$VALUES"
local TOTAL="${#ARRAY[@]}"
echo "$TOTAL"
}
function array_last {
local VALUES=$1
IFS=' ' read -a ARRAY <<< "$VALUES"
echo "${ARRAY[-1]}"
}
function array_pop {
local VALUES=$1
local LENGTH=$(array_total "$VALUES")
IFS=' ' read -a ARRAY <<< "$VALUES"
unset "ARRAY[$LENGTH-1]"
VALUES="${ARRAY[@]}"
echo "$VALUES"
}
function array_slice {
local VALUES=$1
local OFFSET=$2
local LENGTH=$3
IFS=' ' read -a ARRAY <<< "$VALUES"
echo "${ARRAY[@]:$OFFSET:$LENGTH}"
}
function array_to_json {
# Passing the -n option to local causes the parameter to be a nameref variable
local -n ARRAY=$1
local VALUES=${ARRAY[@]}
local VALUE=""
local JSON=""
for VALUE in ${VALUES}; do
VALUE=$(wrap_quotes "$VALUE")
JSON="$VALUE,$JSON"
done
# The json must be a minimum number of characters to be valid
# Do not remove trailing slashes if empty
if [ ${#JSON} -ge 1 ]; then
JSON=${JSON::-1}
fi
echo "[$JSON]"
}
function assoc_array_to_json {
# Passing the -n option to local causes the parameter to be a nameref variable
local -n ARRAY=$1
local KEYS=${!ARRAY[@]}
local KEY=""
local VALUE=""
local JSON=""
local IS_ARRAY=0
local IS_ASSOC_ARRAY=0
for KEY in ${KEYS}; do
VALUE="${ARRAY[$KEY]}"
IS_EMPTY=$(is_empty "$VALUE")
IS_ARRAY=$(is_array "$VALUE")
IS_ASSOC_ARRAY=$(is_assoc_array "$VALUE")
if [ "$IS_EMPTY" -eq 1 ]; then
VALUE='""'
elif [ "$IS_ARRAY" -eq 1 ]; then
VALUE=$(array_to_json "$VALUE")
elif [ "$IS_ASSOC_ARRAY" -eq 1 ]; then
VALUE=$(assoc_array_to_json "$VALUE")
else
VALUE=$(wrap_quotes "$VALUE")
fi
KEY=$(wrap_quotes "$KEY")
JSON="$KEY:$VALUE,$JSON"
done
# The json must be a minimum number of characters to be valid
# Do not remove trailing slashes if empty
if [ ${#JSON} -ge 1 ]; then
JSON=${JSON::-1}
fi
echo "{$JSON}"
}
function wrap_quotes {
echo $(printf '"%s"' "$1")
}
function trim_trailing_char {
local CHAR=$1
local STR=$2
local PATTERN="s/$CHAR$//"
echo "$STR" | sed "$PATTERN"
}
function trim_whitespace {
local STR=$1
echo "$STR" | awk '{$1=$1};1'
}
function search_replace {
local STR=$1
local SEARCH=$2
local REPLACE=$3
local PATTERN="s/$SEARCH/$REPLACE/g"
echo "$STR" | sed "$PATTERN"
}
function get_json_value {
local KEY=$1
local JSON=$2
# Find the key value pair that matches the provided key
local PATTERN="$(wrap_quotes "$KEY"):.*?[^\\\]\""
local MATCH=""
MATCH=$(echo "$JSON" | grep -Po "$PATTERN")
# Get the value from our key value pair
IFS=":" read -r "$KEY" OUTPUT <<< "$MATCH"
local VALUE="$OUTPUT"
# Trim unwanted characters from our value
VALUE=$(trim_whitespace "$VALUE")
VALUE=$(trim_trailing_char ',' "$VALUE")
VALUE=${VALUE:1:-1}
echo "$VALUE"
}
function get_object_from_array {
local INDEX=$1 # 0, 1, 2...
local OBJECTS=$2 # [{"foo":"bar"},{"hello":"world"}]
local OBJECT="" # {"foo":"bar"}
local NEWLINE='\n\r'
local DELIMITER="},{"
local REPLACEMENT="}$NEWLINE{"
# Removes the [ and ] characters from each side
OBJECTS=$(trim_whitespace "$OBJECTS")
OBJECTS=${OBJECTS:1:-1}
# Remove whitespace from delimiter
OBJECTS=$(search_replace "$OBJECTS" "},\s{" "$DELIMITER")
# Splits the objects into new lines
OBJECTS=$(search_replace "$OBJECTS" "$DELIMITER" "$REPLACEMENT")
# Uses the internal field separator to parse each line into an array
declare -a ARRAY
readarray ARRAY <<< "$OBJECTS"
# Returns the requested object by index
OBJECT="${ARRAY[$INDEX]}"
# Remove delimiter from output
OBJECT=$(search_replace "$OBJECT" "$DELIMITER" "")
echo "$OBJECT"
}
function join_by {
IFS="$1"
shift
echo "$*"
}
function exit_on_error {
local RESPONSE=$1
local IS_ERROR=""
local ERROR_MESSAGE=""
IS_ERROR=$(get_json_value "error" "$RESPONSE")
if [[ "$IS_ERROR" == "true" ]]; then
ERROR_MESSAGE=$(get_json_value "message" "$RESPONSE")
echo_red "Error: $ERROR_MESSAGE"
export ERROR=1
fi
}
function echo_red {
local MSG=$1
local COLOR='\033[0;31m'
local N0_COLOR='\033[0m'
local NEW_LINE='\n'
printf "$COLOR$MSG$N0_COLOR$NEW_LINE"
}
function echo_green {
local MSG=$1
local COLOR='\033[0;32m'
local N0_COLOR='\033[0m'
local NEW_LINE='\n'
printf "$COLOR$MSG$N0_COLOR$NEW_LINE"
}
function echo_yellow {
local MSG=$1
local COLOR='\033[1;33m'
local N0_COLOR='\033[0m'
local NEW_LINE='\n'
printf "$COLOR$MSG$N0_COLOR$NEW_LINE"
}
function echo_grey {
local MSG=$1
local COLOR='\033[1;30m'
local N0_COLOR='\033[0m'
local NEW_LINE='\n'
printf "$COLOR$MSG$N0_COLOR$NEW_LINE"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment