Last active
February 9, 2021 16:06
-
-
Save jabes/c00b322d88a3be7fcc1b4898b4d785ee to your computer and use it in GitHub Desktop.
Some Bash Functions
This file contains hidden or 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 | |
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