Last active
October 21, 2019 20:20
-
-
Save stephenmm/fd26919c9d495b610a5066b3d2f90afd to your computer and use it in GitHub Desktop.
An example of how to deref arrays and use them
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
# SOURCE ME | |
# DOES NOT WORK WITH ELEMENTS CONTAINING SPACES!!!! | |
# Limited use. Use a real scriptting language!?!? | |
# Ex: | |
# declare -a cmplxArr='([0]="preffoo" [1]="bar" [2]="foo" [3]="prefbaz" [4]="baz" [5]="prefbar" [6]="pref with spaces" [7]="pref | |
# with | |
# new line" [8]=" | |
# pref with new line before")' | |
# Check to see if this bash version has derefernced arrays | |
unset refArr | |
if declare -n refArr ; then | |
echo "Using a bash version that can dereference arrays (bash>=4.3)" | |
# Dynamically create an array by name | |
function arr_new() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -g -a $1=\(\) | |
} | |
# Insert incrementing by incrementing index eg. array+=(data) | |
function arr_insert() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
declare -n r=$1 | |
r[${#r[@]}]=$2 | |
} | |
# Update an index by position | |
function arr_set() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
declare -n r=$1 | |
r[$2]=$3 | |
} | |
# Get the array content ${array[@]} | |
function arr_get() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
declare -n r=$1 | |
echo ${r[@]} | |
} | |
# Get the value stored at a specific index eg. ${array[0]} | |
function arr_at() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
[[ ! "$2" =~ ^(0|[-]?[1-9]+[0-9]*)$ ]] && { echo "Array index must be a number" 1>&2 ; return 1 ; } | |
declare -n r=$1 | |
local max=${#r[@]} | |
# Array has items and index is in range | |
if [[ $max -gt 0 && $i -ge 0 && $i -lt $max ]] | |
then | |
echo ${r[$2]} | |
fi | |
} | |
# Get the value stored at a specific index eg. ${array[0]} | |
function arr_count() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable " 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
declare -n r=$1 | |
echo ${#r[@]} | |
} | |
else | |
echo "Using a bash version that cannot dereference arrays (bash<4.3)" | |
# Dynamically create an array by name | |
function arr_new() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
# Note: For some reason when using 'declare -ag $1' without the parentheses will make 'declare -p' fail | |
declare -ag $1=\(\) # Could also be created with 'eval $1=\(\)' | |
} | |
# Insert incrementing by incrementing index eg. array+=(data) | |
function arr_insert() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
eval $1[\$\(\(\${#${1}[@]}\)\)]=\$2 | |
} | |
# Update an index by position | |
function arr_set() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
eval ${1}[${2}]=\${3} | |
} | |
# Get the array content ${array[@]} | |
function arr_get() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
eval echo \${${1}[@]} | |
} | |
# Get the value stored at a specific index eg. ${array[0]} | |
function arr_at() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
[[ ! "$2" =~ ^(0|[-]?[1-9]+[0-9]*)$ ]] && { echo "Array index must be a number" 1>&2 ; return 1 ; } | |
local v=$1 | |
local i=$2 | |
local max=$(eval echo \${\#${1}[@]}) | |
# Array has items and index is in range | |
if [[ $max -gt 0 && $i -ge 0 && $i -lt $max ]] | |
then | |
eval echo \${$v[$i]} | |
fi | |
} | |
# Get the value stored at a specific index eg. ${array[0]} | |
function arr_count() { | |
[[ ! "$1" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable " 1>&2 ; return 1 ; } | |
declare -p "$1" > /dev/null 2>&1 | |
[[ $? -eq 1 ]] && { echo "Bash variable [${1}] doesn't exist" 1>&2 ; return 1 ; } | |
local v=${1} | |
eval echo \${\#${1}[@]} | |
} | |
# Remove array elements matching | |
function arr_delete() { | |
aName="$1" | |
[[ ! "$aName" =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] && { echo "Invalid bash variable" 1>&2 ; return 1 ; } | |
declare -p "$aName" > /dev/null 2>&1 | |
#[[ $? -eq 1 ]] && { echo "Bash variable [${aName}] doesn't exist" 1>&2 ; return 1 ; } | |
arr=($(arr_get $aName)) | |
declare -p arr | |
local regex=${2} | |
for i in "${!arr[@]}" ; do [[ ${arr[$i]} =~ ${2} ]] && unset -v 'arr[$i]' ; done | |
declare -p arr | |
arr=("${arr[@]}") # Re-index the array | |
#declare -p arr | |
#echo $(echo ${aName})=\(${arr[@]}\) | |
eval $(echo ${aName})=\(${arr[@]}\) | |
} | |
fi | |
array_names=(bob jane dick) | |
for name in "${array_names[@]}" ; do | |
arr_new dyn_$name | |
done | |
echo "Arrays Created" | |
declare -a | grep "a dyn_" | |
# Insert three items per array | |
for name in "${array_names[@]}" ; do | |
echo "Inserting dyn_$name abc" | |
arr_insert dyn_$name "abc" | |
echo "Inserting dyn_$name def" | |
arr_insert dyn_$name "def" | |
echo "Inserting dyn_$name ghi" | |
arr_insert dyn_$name "ghi" | |
echo "Inserting dyn_$name $name" | |
arr_insert dyn_$name "$name" | |
done | |
for name in "${array_names[@]}" ; do | |
echo "Setting dyn_$name[0]=first" | |
arr_set dyn_$name 0 "first" | |
echo "Setting dyn_$name[2]=third" | |
arr_set dyn_$name 2 "third" | |
done | |
declare -a | grep "a dyn_" | |
for name in "${array_names[@]}" ; do | |
arr_got=($(arr_get dyn_$name)) | |
declare -p arr_got | |
done | |
for name in "${array_names[@]}" ; do | |
echo "Dumping dyn_$name by index" | |
# Print by index | |
for (( i=0 ; i < $(arr_count dyn_$name) ; i++ )) ; do | |
echo "dyn_$name[$i]: $(arr_at dyn_$name $i)" | |
done | |
done | |
for name in "${array_names[@]}" ; do | |
echo "Removing elements in dyn_$name" | |
eval declare -p dyn_$name | |
# arr_delete dyn_$name '^fir' | |
# arr_delete dyn_$name 'i' | |
# arr_delete dyn_$name 'ird' | |
arr_delete dyn_$name '^de' | |
eval declare -p dyn_$name | |
done | |
declare -a cmplxArr='([0]="preffoo" [1]="bar" [2]="foo" [3]="prefbaz" [4]="baz" [5]="prefbar" [6]="pref with spaces" [7]="pref | |
with | |
new line" [8]=" | |
pref with new line before")' | |
arr_delete cmplxArr 'foo' | |
declare -p cmplxArr | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment