Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save jimratliff/ba106fde393e8ed8f8828ca32f44365f to your computer and use it in GitHub Desktop.

Select an option

Save jimratliff/ba106fde393e8ed8f8828ca32f44365f to your computer and use it in GitHub Desktop.
Empirical test of bash variable scope: main calls function, which calls deeper function #bash
##########################################################################################
#!/usr/bin/env bash
#
# Script to determine empirically the extent to which a variable set in a script or
# function can be seen by a hierarchically related function or script
# Specifically, (a) main script calls (b) function level1(), which calls
# function level2(). (No arguments are used in any function call.)
# Scalar variables are set in each component prior to any function call:
# Main script sets $set_in_main_x, for x ∈ {A,B,C}
# Function level1() sets $set_in_level_1_x, for x ∈ {A,B,C}
# Function level2() sets $set_in_level_2_x, for x ∈ {A,B,C}
# When each of the two functions is called, it looks to see whether it can see the
# variables in the component(s) above it.
# When control returns to the main script or level1(), it checks to see whether it can
# variables set in the returning function.
# Each function also attempts to change a value in the script/function above it that had
# set by the calling entity.
# E.g., $set_in_main_B was first set in main, and then re-set by level(1).
# The same exercise is performed with arrays (rather than a scalar variable).
#
# Results of test:
# Summary: Every component could see/change every variable in every other component
# Arrays were seen, and could be changed, as much as scalars
# Specifically:
# Both functions could see/change the variable set in Main: set_in_main_A="543"
# Main could see the variables set in level1() and level2(), e.g.,
# set_in_level_1_A? 666
# set_in_level_2_A? 965
# level1() could see the values set in level2(); e.g., set_in_level_2_A? 965
#
# Output:
# In Main, before calling level1()
# set_in_main_A: 543
# set_in_main_B: 901
# set_in_main_C: 444
# array_set_in_main_A: sd rg
# array_set_in_main_B: 5y jy
# array_set_in_main_C: lp ####
# Calling level1().
# ##############################
# In Level 1, before calling Level 2
# Can I see set_in_main_A? 543
# Can I see array_set_in_main_A: sd rg
# set_in_level_1_A: 666
# set_in_level_1_B: 777
# set_in_level_1_C: 888
# array_set_in_level_1_A: jk ?B
# array_set_in_level_1_B: 11 22
# array_set_in_level_1_C: 33 77
# ##############################
# In Level 2
# Can I see set_in_main_A? 543
# Can I see set_in_level_1_A? 666
# Can I see array_set_in_main_A: sd rg
# Can I see array_set_in_level_1_A: jk ?B
# set_in_level_2_A: 965
# set_in_level_2_B: 432
# set_in_level_2_C: 131
# array_set_in_level_2_A: tag enemy
# array_set_in_level_2_B: hash bacon
# array_set_in_level_2_C: tr egg
# In Level 1, after calling Level 2
# Can I see set_in_level_2_A? 965
# Can I see array_set_in_level_2_A: tag enemy
# set_in_level_1_C: 999
# ##############################
# In Main, after calling level1()
# Can I see set_in_level_1_A? 666
# Can I see set_in_level_2_A? 965
# Have the functions changed the values that were originally set in main()?
# set_in_main_A: 543
# set_in_main_B: 999
# set_in_main_C: 999
# array_set_in_main_A: sd rg
# array_set_in_main_B: 999 999
# array_set_in_main_C: 999 999
function level1() {
set_in_level_1_A="666"
set_in_level_1_B="777"
set_in_level_1_C="888"
array_set_in_level_1_A=( "jk" "?B")
array_set_in_level_1_B=( "11" "22")
array_set_in_level_1_C=( "33" "77")
echo "##############################"
echo "In Level 1, before calling Level 2"
echo "Can I see set_in_main_A? $set_in_main_A"
echo "Can I see array_set_in_main_A: ${array_set_in_main_A[@]}"
echo "set_in_level_1_A: $set_in_level_1_A"
echo "set_in_level_1_B: $set_in_level_1_B"
echo "set_in_level_1_C: $set_in_level_1_C"
echo "array_set_in_level_1_A: ${array_set_in_level_1_A[@]}"
echo "array_set_in_level_1_B: ${array_set_in_level_1_B[@]}"
echo "array_set_in_level_1_C: ${array_set_in_level_1_C[@]}"
level2
echo "In Level 1, after calling Level 2"
echo "Can I see set_in_level_2_A? $set_in_level_2_A"
echo "Can I see array_set_in_level_2_A: ${array_set_in_level_2_A[@]}"
echo "set_in_level_1_C: $set_in_level_1_C"
# Modify values in main script
set_in_main_B="999"
array_set_in_main_B=( "999" "999")
}
##############################
function level2() {
echo "##############################"
echo "In Level 2"
echo "Can I see set_in_main_A? $set_in_main_A"
echo "Can I see set_in_level_1_A? $set_in_level_1_A"
echo "Can I see array_set_in_main_A: ${array_set_in_main_A[@]}"
echo "Can I see array_set_in_level_1_A: ${array_set_in_level_1_A[@]}"
set_in_level_2_A="965"
set_in_level_2_B="432"
set_in_level_2_C="131"
array_set_in_level_2_A=( "tag" "enemy")
array_set_in_level_2_B=( "hash" "bacon")
array_set_in_level_2_C=( "tr" "egg")
echo "set_in_level_2_A: $set_in_level_2_A"
echo "set_in_level_2_B: $set_in_level_2_B"
echo "set_in_level_2_C: $set_in_level_2_C"
echo "array_set_in_level_2_A: ${array_set_in_level_2_A[@]}"
echo "array_set_in_level_2_B: ${array_set_in_level_2_B[@]}"
echo "array_set_in_level_2_C: ${array_set_in_level_2_C[@]}"
# Modify values in main script and in level1()
set_in_level_1_C="999"
array_set_in_level_1_C=( "999" "999")
set_in_main_C="999"
array_set_in_main_C=( "999" "999")
}
############################## Main script
echo "##################################"
set_in_main_A="543"
set_in_main_B="901"
set_in_main_C="444"
array_set_in_main_A=( "sd" "rg")
array_set_in_main_B=( "5y" "jy")
array_set_in_main_C=( "lp" "####")
echo "In Main, before calling level1()"
echo "set_in_main_A: $set_in_main_A"
echo "set_in_main_B: $set_in_main_B"
echo "set_in_main_C: $set_in_main_C"
echo "array_set_in_main_A: ${array_set_in_main_A[@]}"
echo "array_set_in_main_B: ${array_set_in_main_B[@]}"
echo "array_set_in_main_C: ${array_set_in_main_C[@]}"
echo "Calling level1()."
level1
echo "##############################"
echo "In Main, after calling level1()"
echo "Can I see set_in_level_1_A? $set_in_level_1_A"
echo "Can I see set_in_level_2_A? $set_in_level_2_A"
echo "Have the functions changed the values that were originally set in main()?"
echo "set_in_main_A: $set_in_main_A"
echo "set_in_main_B: $set_in_main_B"
echo "set_in_main_C: $set_in_main_C"
echo "array_set_in_main_A: ${array_set_in_main_A[@]}"
echo "array_set_in_main_B: ${array_set_in_main_B[@]}"
echo "array_set_in_main_C: ${array_set_in_main_C[@]}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment