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
#!/bin/bash | |
#This simple code demonstrates how to define a function, local and global variables in bash. | |
#And most importantly, how to launch background processes and wait for their termination | |
gvar="Glob value" | |
ncalls=0 | |
avar="Test" | |
# Note for ksh users: in ksh to mark a function definition you should use either function keyword | |
# or () after the function name, not both | |
function a_proc(){ | |
echo ${gvar} | |
local avar=$1 #ksh users: use 'typeset' instead of 'local' | |
echo "Input: ${avar}" | |
sleep 100 | |
avar=$(date) | |
echo "Output: ${avar}" | |
ncalls=$((${ncalls} + 1)) | |
} | |
a_proc "$(date)" & | |
a_proc "$(date)" & | |
a_proc "$(date)" & | |
a_proc "$(date)" & | |
a_proc "$(date)" & | |
a_proc "$(date)" & | |
wait | |
#Although I am trying to update ${ncalls} assuming that this will change my global variable, but ... | |
#This is because I am launching the function in background, which works in a subshell, | |
#so global variables won't be updated | |
echo "ncalls=${ncalls}" | |
echo "avar=${avar}" | |
##But look what happens with ncalls when launched in foreground | |
a_proc "$(date)" | |
echo "ncalls=${ncalls}" | |
##Conclusion: the local keyword (for bash, use typeset for ksh) can be useful if you want to make sure that you are not | |
##changing a global variable in your function | |