57 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
tags:
 | 
						|
  - shell
 | 
						|
---
 | 
						|
 | 
						|
# Variable indirection
 | 
						|
 | 
						|
> Write proper notes on this
 | 
						|
 | 
						|
```sh
 | 
						|
function array_empty() {
 | 
						|
    declare -n arr=$1
 | 
						|
    # Proceed if array not empty:
 | 
						|
    if [ ${#arr[@]} -gt 0 ]; then
 | 
						|
        return 1 # array is not empty
 | 
						|
    else
 | 
						|
        return 0 # array is empty
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
my_array=(1 2 3)
 | 
						|
 | 
						|
function push() {
 | 
						|
    # $1 = stack name
 | 
						|
    local stack_name="$1"
 | 
						|
    if [ "${stack_name}" ]; then # stack exists
 | 
						|
        if array_empty "${!stack_name}"; then
 | 
						|
            echo "stack is empty"
 | 
						|
        else
 | 
						|
            echo "stack is not empty"
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        echo "Error: ${stack_name} does not exist."
 | 
						|
    fi
 | 
						|
}
 | 
						|
 | 
						|
push "my_array"
 | 
						|
 | 
						|
```
 | 
						|
 | 
						|
In Bash scripting, ${!stack_name} is an example of indirect variable referencing
 | 
						|
or variable indirection. It's a way to use a variable whose name is stored in
 | 
						|
another variable.
 | 
						|
 | 
						|
Let's break it down:
 | 
						|
 | 
						|
`${stack_name}`: This syntax is used to reference the value of a variable. So if
 | 
						|
stack_name="my_array", then ${stack_name} would return "my_array".
 | 
						|
 | 
						|
`${!stack_name}`: Adding the ! introduces indirection. Now, instead of getting
 | 
						|
the value of stack_name, you get the value of the variable whose name is stored
 | 
						|
in stack_name. So if stack_name="my_array" and my_array=(1 2 3), then
 | 
						|
${!stack_name} would return (1 2 3).
 | 
						|
 | 
						|
So, in the context of your script, `${!stack_name} allows you to pass the name
 | 
						|
of an array (as a string) to your push function, and then use that string to
 | 
						|
indirectly reference the actual array within the function.
 |