I found an awesome answer on StackOverflow which explains how to pass an associative array to a function. Would someone be able to help me figuring out what the syntax of ${1#*=} in the code below specifies? (Borrowed from that answer by jaypal singh):
#!/bin/bash
declare -A weapons=(
['Straight Sword']=75
['Tainted Dagger']=54
['Imperial Sword']=90
['Edged Shuriken']=25
)
function print_array {
eval "declare -A arg_array="${1#*=}
for i in "${!arg_array[@]}"; do
printf "%s\t%s\n" "$i ==> ${arg_array[$i]}"
done
}
print_array "$(declare -p weapons)"
Here's my guess so far (correct me if I'm wrong on any of these):
- 1 means the first parameter passed to the function ($1 or ${1})
- # means the index of $1, which, since $1 is an associative array, makes # the keys of $1
- * means the values of of the # keys in associate array $1
That leaves the =. What does that signify? Is that like a way to show that you want # and * to mean the keys and values of the associate array?
The snippet ${1#*=} has nothing to do with associative arrays.* (Bash's syntax is super consistent, and not at all confusing)
This is a pattern match on the value of the first argument (${1}) of your function or script. Its syntax is
${variable#glob}
where
variable is any bash variableIt deletes the shortest match, starting at the beginning of the line.
There is also ## which deletes the longest match starting from the beginning of the variable, %, which deletes the shortest match starting from the end, and %%, which deletes the longest match starting from the end.
So, for example, the following code:
myVar="abc=llamas&disclaimer=true"
echo "${myVar#*=}"
will print llamas&disclaimer=true to the screen.
On the other hand,
myVar="abc=llamas&disclaimer=true"
echo ${myVar##*=}
will print true, and
myVar="foobar is bad"
echo "${myVar%%b*}"
will print foo
* This is fully explained in the bash man page; just search for the string ${parameter#word} to find it
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With