Last active
May 29, 2018 04:56
-
-
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
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
| ########################################################################################## | |
| #!/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