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
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
}
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
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
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
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
+