07. Functions (Part 2)
Variable Scope – Global Scope
- Variables in a script have global scope by default
- This means that any variable created in a function can be ‘seen’ and used by other functions in the script
- For example, the following 2 functions both run without error
readID( )
{
read –p “Enter ID: ” id # id is created here
}
printID( )
{
echo “Your ID is $id” # id is accessed here
}
- The only variables that have local scope (will change from function to function) are the positional parameters $1, $2, $3, ..., $@
- Global variables make it simpler for functions to share data, there is no need to pass data back and forth between functions
Variable Scope – Local Scope
- Global variables can be dangerous when used in a library function, which typically is called by many different scripts
- For example, we write a library function called fA:
- fA () { temp=10; }
- Since fA is a library function, it can be called from many different scripts that need fA’s functionality
- Supposed someone has a script called scriptB that contains these lines of code:
temp=‘/etc/passwd’
fA
echo $temp
- When scriptB runs, the value being printed will be: 10 and not /etc/passwd
- This can make us unpopular with the callers of our fA function!
- In this case, we want temp in fA to have local scope. This means that temp exists only when fA runs, and it is a different variable than any other temp variable that might be in use
- To make a variable have local scope, use the local declaration:
local varName
- Examples:
fA () { local temp=10; } # temp is only for fA
OR
readID( )
{
local id # id can only be used by readID
read –p “Enter ID: ” id
}
Function Usage
- There are 3 common ways that functions are used
- The function block appears at the begining of a script
- The function can be called as many time as needed in the script, but the function is not available outside of the script
- The function block is put in the ~/.bashrc file
- When a shell first starts running, it reads the .bashrc file, and any function defined in this file is then ‘known’ to the shell
- Any function defined in ~/.bashrc can be run on the command line
- For example, in the .bashrc file is the function
- goHome ( ) { cd; echo At `pwd`; }
- On the command line: goHome
- will bring the user to the home directory, and the user’s current directory (home) path will be printed
- The function block is put in a text file
- Before calling the function, the text file needs to be loaded into memory with the . operator
- Then the function can be called on the command line
- Example:
$ cat fileA fileA has the function sayHi
sayHi ()
{
echo Hi $USER
}
$ . fileA activate fileA
$ sayHi calling function sayHi
Hi testUser
Library of Functions
- A library of functions is created by storing multiple function blocks in a text file
- The text file becomes the library file
- Once the library file is loaded into memory with the . operator, all functions in the library can be called individually on the command line
- In a similar way, a script can also use the . operator to load the library file into memory and call functions in the library file
- Example:
- Assume fileA from the previous slide, with the function sayHi, we can have a scriptB:
$ cat scriptB
. fileA # activate fileA
sayHi # call function sayHi
- Now run scriptB:
$ scriptB # run scriptB
Hi testUser # output of sayHi
The Here Document Introduction
- There are times when the script needs to print multiple lines of text, such as instructions, to the user
- There are 2 ways to do this
- Use multiple echo commands in the script, one echo per line of text
- Put all the lines of text into a text file, then use the cat command in the script to print the text file
- A more convenient way is to merge the 2 ways above and use the here document. The here document is called this way because the text is here in the script itself
- The here document is like a mini text file within the script
- This mini text file is sent to the user through any command that can accept multiple input lines of text
- For example
- Use cat if you want to print the here document
- Use mail if you want to email the here document
- Use grep if you want to select certain lines of the here document
- Format:
command << token
text
…
text
token
- command is any utility that can accept multiple input lines of text
- token is any symbol or string of your choice, but the 2 tokens at the start and the end must match
- The << operator works like the input redirection operator <
- The start token must be on the same line as <<
- The end token must be on a line by itself, and it must be at the beginning of the line
- The shell sends everything between the start and end tokens to the command, and the command processes every line of text in the here document as if they are from a text file
The Here Document Examples
- In a script, print instructions to the user
cat << menu
d: delete file
p: print file
q: quit
menu
- From a script, email a short message to the user
mail $USER << msg
start of script $0
on $date by $USER
msg
- From a script, select certain lines of the document based on user command line argument
grep $1 << +
doctor 555-1234
school 555-3456
work 555-6789
+