13,420
edits
Changes
no edit summary
:* Explain the purpose of the '''she-bang line''' contained at the top of a shell script.
:* Set '''permissions''' and '''execute''' a shell scriptscripts.
:* Use '''environment''' and '''user-defined''' variables in shell scripts.
===Creating & Executing Shell Scripts===
It is recommended to '''plan''' out on a piece of paper the purpose of the shell script.<br>Once you have planned your shell script by listing the '''sequence of steps(commands)''',<br>you need to create a file (using a '''text editor''') that will contain your Linux commands.<br><br>'''NOTE:''' Avoid using filenames of already existing Linux Commands to avoid confusion.<br>It is recommended to include a file extension that describes the type of shell for the shell script.<br><br>
'''Using a Shebang Line'''
[[Image:shebang.png|thumb|right|200px|The '''shebang line''' <u>must</u> appear on the '''first line''' and at the '''beginning''' of the shell script.]]Since Linux shells have evolved over a period of time, using a she-bang line '''forces''' the shell script<br>to run in a '''specific shell''', which could prevent errors in case an older shell does not recognize<br>newer features from more recent shells.<br><br>The '''she-bang''' line is a '''special comment''' at top of your shell script to run your shell script<br>in that a specific shell.<br><br>
'''NOTE:''' The '''shebang line''' <u>must</u> appear on the '''first line''' and at the '''beginning''' of the shell script,<br>otherwise, it will be treated as a regular comment and ignored.<br><br>
'''Setting Permissions & / Running a Shell ScriptScripts'''
To run your shell script by name, you need to assign '''execute permissions''' for the user.<br>To run the shell script, you can '''execute''' the shell script using a ''relative'', ''absolute'', or ''relative-to-home'' pathname
''Examples:''<br><span style="font-family:courier;">'''chmod u+x myscript.bash<br>./myscript.bash<br>/home/username/myscript.bash<br>~/myscript.bash</span>
'''
<br><br>
===Using Variables in Shell Scripts/ Parameters===
'''Environment Variables'''
[[Image:environment.png|thumb|right|500px|Examples of using '''Environment''' and '''User Defined''' variables.]]Shell '''environment variables''' shape the working environment whenever you are logged in Common shell. Some of these variables are displayed via Linux commands in the diagram displayed on the right-side.<br><br>You can issue the pipeline command '''<span style="font-family:courier;font-weight:bold">set | more''' </span><br>to view all variables.<br><br>Placing a dollar sign ('''"<span style="font-family:courier;font-weight:bold">$''') </span>" prior to the variable name will cause the variable to expand to the value contained in the variable.
'''User Defined Variables'''
<br><br>
Data can be stored and removed within a variable using an '''equal sign''' (no spaces on either side of equal sign).<br><br>The '''read''' command can be used to prompt the user to enter data into a variable. The '''readonly''' command will prevent<br>the current value of the variable for the remainder of the execution of a shell script.<br><br>
'''Positional Parameters and Special Parameters'''
[[Image:positional.png|thumb|right|220px|Examples of using '''positional''' and '''special''' parameters.]]A '''positional parameter''' is a variable within a shell program; its value is set from an argument specified on arguments contained in a shell script or using the '''set''' command line that invokes the program.Positional parameters are numbered and their values are accessed by using <br>a preceding "'''$'''" (eg. '''$1''', '''$2''', '''$3''', etc.). The positional parameter '''$0''' refers to <br>either the '''name of shell ''' where command was issued, or name '''filename of shell script ''' being executed. <br>If using '''positional parameters''' greater than '''9''', then you need to include number within braces.<br><br>Examples: '''echo ${10}''', '''ls ${23}'''<br><br>
The '''shift''' command can be used with positional parameters to shift positional parameters<br>to the left by one or more positions.
There are a group of '''special parameters''' that can be used for shell scripting.<br>A few of these special parameters and their purpose are displayed below:<br>'''$*''' , '''“$*”''' , '''"$@"''' , '''$#''' , '''$?'''
=== Command Substitution / Math Operations ===
<br>
'''Command Substitution:'''
[[Image:for-command-substitution.png|thumb|right|300px|Example of how a '''for loop with command substitution''' works.]]
<i>'''Command substitution''' is a facility that allows a command<br>to be run and its output to be pasted back on the command line as arguments to another command.</i><br>Reference: https://en.wikipedia.org/wiki/Command_substitution<br><br>
''Usage:''
<span style="font-family:courier;font-weight:bold">file $(ls)<br>mail -s "message" $(cat email-list.txt) < message.txt<br>echo "The current directory is $(pwd)"<br>echo "The current hostname is $(hostname)"<br>echo "The date is: $(date +'%A %B %d, %Y')"<br>
<br><br>
'''Math Operations:'''
[[Image:math-op.png|thumb|right|275px|Common Math Operator Symbols.]]
In order to make math operations work, we need to convert numbers<br>stored as '''text''' into '''binary numbers'''.<br><br>We can do this by using 2 pairs of round brackets '''(( ))'''.<br><br>
''Examples:''
50
</pre>
<br>
===Using Control Flow Statements in Shell Scripts=== <br>
<table align="right"><tr valign="top"><td>[[Image:test-1.png|thumb|right|140px|Examples of simple comparisons using the test command.]]</td><td>[[Image:test-2.png|thumb|right|140px|Examples of using additional comparisons using the test command.]]</td></table>
'''Control Flow Statements''' are used to make your shell scripts <br>more '''flexible''' and can '''adapt''' to changing situations.<br><br>In order to use control flow statements, you need to test a condition to get<br>'''TRUE''' (zero value) or '''FALSE''' (non zero value). This can be done two ways:<ul><li>Run a command to get the exit status (<span style="font-family:courier;font-weight:bold;">$?</span>)</li><li>Use the '''test''' command</li></ul><br>Refer to the diagrams on the right to see how to use the test command.<br><br>
'''Logic Statements'''
A '''logic statement''' is used to determine which Linux commands to be executed based<br>on are executed basedon the result of a condition (i.e. TRUE (zero value) or FALSE (non-zero value)). :<table align="right"><tr valign="top"><tdbr>[[Image:logic-1.png|thumb|right|250px|Example of using the '''ifTRUE''' logic control-flow statement.]]</td><td>[[Image:loop-1.png|thumb|right|250px|Example of using the (zero value) or '''forFALSE''' looping control(non-flow statementzero value).]]</td></table>
[[Image:logic-1.png|thumb|right|210px|Example of using the '''if''' logic control-flow statement.]]
<br>
There are several logic statements, but we will just concentrate on the if statement.
<pre style="width:20%">
</pre>
Refer to the diagram immediately to the right for using the '''if logic statement''' with the '''test''' command.
<br><br><br><br><br>
'''if-else statement:'''
<br>
[[Image:iflogic-else2.png|thumb|right|300px210px|Example of how an '''if-else''' control-flow statement works.<br>(Image licensed under [https://creativecommons.org/licenses/by-sa/3.0/ cc])]]
Unlike using only an ''if'' statement, an '''if-else''' statement take '''two different sets of actions'''<br>based on the results of the test condition.<br><br>''How it Works:''<br>When the test condition returns a '''TRUE''' value, then the Linux Commands between<br>'''then''' and '''else''' statements are executed.<br>If the test returns a '''FALSE''' value, then the the Linux Commands between<br>the '''else''' and '''fi''' statements are executed.<br><br>
''Example:''
<span pre style="font-familywidth:courier;font-weight:bold;20%">num1=5<br>num2=10<br>if test $num1 –lt $num2<br>condition then<br> echo “Less Than”<br> command(s) else<br>echo “Greater Than or Equal to”<br> command(s) fi</span><br><brpre>
'''Loop Statements'''
[[Image:loop-1.png|thumb|right|210px|Example of using the '''for''' looping control-flow statement.]]''A <b>loop statement</b> is a series of steps or sequence of statements executed repeatedly <br>zero or more times satisfying the given condition is satisfied.''<br>Reference: https://www.chegg.com/homework-help/definitions/loop-statement-3
There are several loops, but we will look at the '''for loop''' using a '''list'''.
Refer to the diagram above and to the extreme right side for an example using the '''for loop''' with a '''list'''.
<br><br>
=INVESTIGATION 1: CREATING A SHELL SCRIPT=
<span style="color:red;">'''ATTENTION''': Depending on your ULI101 instructor, you may be required to complete this tutorial for '''marks''' in this course.<br>Please refer to your instructor's course notes and lecture notes regarding evaluation for this course.<br><br>The due date for successfully completing this tutorial (i.e. '''tutorial 10''') is by '''Friday by midnight''' next week (i.e. '''Week 10''').<br>If your instructor has NOT assigned marks for completing this tutorial, you can perform it for '''practice'''.</span><br><br> In this sectioninvestigation, you will learn how to create and run a '''simple Bash Shell script'''.
# '''Login''' to your matrix account.<br><br>
# Issue a command to '''confirm''' you are located in your '''home''' directory.<br><br>We want to create a Bash Shell script to welcome the user by their ''username''.<br>Let's first provide some useful tips in terms of look at selecting an appropriate name filename for the your shell script.<br><br># Issue the following linux command to check if your intended shell script namethe filename called '''hello'''<br>is already exists to be run automatically from the Bash shellas a command:<br><span style="color:blue;font-weight:bold;font-family:courier;">which hello</span><br><br>You The output from this command should notice indicate that the shell did NOT<br>find any directories that contained this filename that there is no output and could represent<br>a command; therefore, this shell script name CAN be used.<br><br>[[Image:hello0.png|thumb|right|200px|Using a '''text editor''' to add Linux commands in to the '''hello''' shell script.]]# Use a '''text editor''' like '''vi''' or '''nano''' to create the text file called '''hello'''<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following two lines in your shell script, replacing "your-username" with your actual name:<br><span style="font-family:courier;font-weight:bold;">echo<br>echo "Hello $USER"<br>echo</span><br><br>'''NOTE:''' The variable called '''USER''' is an '''environmentvariable''' variable that contains the <u>current </u> user's login name.<Br>In this way if If you wanted to share your shell script with other users, when they run the shell script<br>it , they will greet greeted by <u>their</u> username. Using ''environment Environment variables'' makes make your shell script to be more "usable" adaptable by othersALL users.<br><br># '''Save ''' your editing session and '''exit ''' the text editor.<br><br>Instead of issuing the '''bash''' command followed by your shell script pathname as an ''argument'',<br>let's simply run it by its filename. This is the most common method of running shell scripts.<br><br><table align="right"><tr valign="top"><td>[[Image:no-execute.png|thumb|right|230px|An '''error message''' will appear when trying to run a shell script by name that does NOT have '''execute''' permissions.]]</td><td>[[Image:hello1.png|thumb|right|150px|Output of command from running your '''hello''' shell script (YourUserID is representing <u>your </u> username).]]</td></table># Issue the following linux command to run your shell script in your current directory:<br><span style="color:blue;font-weight:bold;font-family:courier;">./hello</span><br><br>'''You should notice an error '''ERROR message''' indicating you don't have permissions to run the file'''.To fix this, you need to<br>You need to first add '''add execute permissions''' prior to running the shell script.<br><br># Issue the following linux command to '''add '''<br>execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x hello</span><br><br># Re-Issue the following to run your shell script: <br><span style="color:blue;font-weight:bold;font-family:courier;">./hello</span><br><br>Did you your shell script run?<br><br><span style="color:red;">'''ATTENTION:''' Students will might get FRUSTRATED when performing their '''assignment 3''' when their Bash shell scripts have errors. <br>One major cause is the the OUTPUT of their Bash shell script when run does not '''EXACTLY match''' the required output <br>for the '''correct ''' Bash shell script. <br><br>This requires that you CAREFULLY '''read''' the requirements of your Bash shell script and create it to the EXACT specifications</span><br><br># Issue the following Linux command to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">bash /home/murray.saul/myscripts~uli101/week10-check-1</span><br><br>
# If you encounter errors, make corrections and '''re-run''' the checking script until you<br>receive a congratulations message, then you can proceed.<br><br>
::In the next investigation, you will learn to create and run shell scripts that<br >use '''variables''', '''positional ''' and '''special parameters'''. You will also learn how to<br><u>add</u> a '''she-bang line''' at the top of a shell script to force it to run in a specified shell.<br><br>Proceed to the next investigation.<br><br>
=INVESTIGATION 2: USING SHE-BANG LINE / VARIABLES IN SHELL SCRIPTS / PARAMETERS=
In this sectioninvestigation, you will add a '''she-bang''' line at the top of your shell script to force the shell script to run in a<br>specified shell when executed. You will also learn how to use '''variables''', '''positional ''' and '''special parameters '''<br>to assist you in creating adaptable make your shell scriptsmore adaptable.
'''Perform the Following Steps:'''
# Confirm that you are located in your '''home''' directory in your Matrix account.<br><br>Let's run shell scripts <u>with</u> and <u>without</u> a '''she-bang''' line at the top of your shell script<br>to demonstrate why using a ''she-bang'' line should be included in a shell script to force<br>the shell script to be run in a ''specific'' shell.<br><br># Use a text editor to '''edit ''' the shell script called '''hello'''shell script that you created in the <u>previous</u> investigation.<br><br># Add the following line to the <u>bottom</u> of the file('''copy''' and '''paste''' to prevent ''errors''):<br><span style="font-family:courier;font-weight:bold;">echo "The current shell you are using is: $(ps -o cmd= -p $$|cut -d' ' -f1)"</span><br><br>'''NOTEFYI:''' This command displays the '''name''' of the ''shell'' that the shell script is running in.<br>The command within <span style="font-family:courier;font-weight:bold;">$( )</span> uses a technique known as '''command substitution'''.<br><br># Issue the following linux Linux command to change to an older shell called the '''Bourne Shell''':<br><span style="color:blue;font-weight:bold;font-family:courier;">sh</span><br><br>You should notice your '''shell prompt changed that ''' which indicates <br>that you are in a different shell.<br><br>[[Image:hello2.png|thumb|right|275px|Changing the Bourne shell and running shell script '''without''' a '''She-bang''' line.]]# Issue the following linux Linux command to run your shell script in the ''Bourne Shell'':<br><span style="color:blue;font-weight:bold;font-family:courier;">./hello</span><br><br>You should see that you are currently running the shell script "'''sh'''" that <br>which represents the '''Bourne shell'''.<br><br>'''NOTE:''' Due to the fact that shells (and their features) have '''evolved''' over a period of time,<br>an error may occur if you include a '''NEWERshell feature''' shell feature (e.g. ''Bash Shell'') in your shell script,<br>but run it in an '''OLDERshell''' shell (e.g. For example: the ''Bourne Shell'').<br><br>[[Image:she-bang-1.png|thumb|right|275px|Adding a '''she-bang line''' at the BEGINNING of the first line in you shell script forces the shell script to be run in that specific shell (in this case, the Bash shell).]]You can add a '''special comment''' to called a '''she-bang line''' at the BEGINNING of the <br><u>FIRST line</u> of your shell script to<br>'''force''' it to run in the shell you want <br>(for example: the Bash shell).<br><br>
# Edit your '''hello''' shell script using a text editor.<br><br>
# '''Insert''' the following line at the '''beginning''' of the '''first''' line of your hello file:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash</span><br><br>This is referred to as a '''she-bang line'''. It forces this script to be run in the '''Bash Shell'''.<br>When your Bash Shell script finishes execution, you are returned to your current shell that you are using<br>(which in our case in Matrix, is still the Bash shell).<br><br>[[Image:hello3.png|thumb|right|275px|Changing the Bourne shell and running shell script '''with''' a '''She-bang''' line (forcing script to run in the '''Bash''' shell).]]
# '''Save''' your editing changes and '''exit''' your text editor.<br><br>
# While in the ''Bourne shell'', issue the following linux Linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">./hello</span><br><br>You should notice that the shell name is running in the '''Bash shell'''(i.e. ''/bin/bash'').<br><br> # It is a good idea to rename your shell script to include an '''extension''' to<br>explain indicate that this it is a '''Bash Shell script''' file (referred to as a "''portable Bash shell script''"). <br><br># Issue the following linux Linux command to rename your shell script file:<br><span style="color:blue;font-weight:bold;font-family:courier;">mv hello hello.bash</span><br><br># Run your Confirm that the renamed Bash shell script for confirmation works by issuing:<br><span style="color:blue;font-weight:bold;font-family:courier;">./hello.bash</span><br><br># Enter the following linux Linux command to '''exit''' the ''Bourne shell'' and return to your ''Bash shell'':<br><span style="color:blue;font-weight:bold;font-family:courier;">exit</span><br><br>'''Environment variables''' are used to set the environment of the shell or shell scripts<br>Let's use include some '''ENVIRONMENT variables''' in our Bash Shell script.<br><br>
# Use a text editor to edit the shell script called '''hello.bash'''<br><br>
# Add the following lines to the <u>bottom</u> of the ''hello.bash'' file:<br><span style="font-family:courier;font-weight:bold;">echo<br>echo "The current directory location is: $PWD"<br>echo "The current user home directory is: $HOME"<br>echo</span><br><br># Save your editing changes and exit your text editor.<br><br>[[Image:hello4-0.png|thumb|right|330px|Running <u>modified</u> ''hello.bash'' Bash shell script by using relative pathname: <span style="font-family:courier;">''./hello.bash''</span>]]# Run your renamed modified Bash shell script for confirmation by issuing:<br><span style="color:blue;font-weight:bold;font-family:courier;">./hello.bash</span><br><br>Take time to view the output and the values of the environment variables.<br><br>You can modify the PATH variable to include the current directory (i.e. ".")<br>so you can run the command by just script filename<br>(eg. <span style="font-family:courier;font-weight:bold;">hello.bash</span> as opposed to <span style="font-family:courier;font-weight:bold;">./hello.bash</span>)<br><br># Issue the following linux Linux command to add your current directory to the '''PATH''' environment variable:<br><span style="color:blue;font-weight:bold;font-family:courier;">PATH=$PATH:.</span><br><br>[[Image:hello4.png|thumb|right|330px|Running <u>modified</u> '''hello.bash''' Bash shell script by entering by <u>just</u> '''filename''' only(i.e. <span style="font-family:courier;">''hello.bash''</span> and NOT <span style="font-family:courier;">''./hello.bash''</span> shown in previous diagram).]]# Issue the following linux Linux command to confirm that the current directory '''"."''' <br>has been '''added ''' to the <u>end</u> of the '''PATH''' environment variable:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $PATH</span><br><br>
# Issue the following to run your Bash shell script just by name:<br><span style="color:blue;font-weight:bold;font-family:courier;">hello.bash</span><br><br>Did your Bash shell script run?<br><br>
# Exit your Matrix session, and log back into your Matrix session.<br><br>
# Re-run the '''hello.bash''' shell script by just using the name.<br><br>What did you notice?<br><br>The setting of the '''PATH''' environment variable only worked in the current session only.<br>If you exit the current Matrix session, then the recently changed settings for environment variables will be lost.<br>You will in a <u>future</u> tutorial how to set environment variables in '''start-up''' files.<br><br><span style="color:red;">'''ATTENTION:''' Students will might get FRUSTRATED when performing their '''assignment 3''' when their Bash shell scripts have errors. <br>One major cause is the the OUTPUT of their Bash shell script when run does not '''EXACTLY match''' the required output <br>for the '''correct ''' Bash shell script. <br><br>This requires that you CAREFULLY '''read''' the requirements of your Bash shell script and create it to the EXACT specifications</span>.<br><br># Issue the following Linux command to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">bash /home/murray.saul/myscripts~uli101/week10-check-2 | more</span><br><br>If you encounter errors, make corrections and '''re-run''' the checking script until you<br>receive a congratulations message, then you can proceed.<br><br>Unlike '''Environment variables''' that are used to set the environment of the shell or shell scripts,<br>'''User-created''' variables are "customized" that the user can set or allow a user to set the variables' values.<br>Let's create a Bash shell script that contain '''user-created variables'''.<br><br>
# Use a text editor to create a Bash shell script called '''user-variables.bash'''<br><br>
# Add the following lines to the beginning of this the ''user-variables.bash'' file:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>read -p "Enter your Full Name: " name<br>read -p "Enter your age (in years): " age<br>echo "Hello $name - You are $age years old"</span><br><br>
# Save your editing changes and exit your text editor.<br><br>[[Image:user-variable1.png|thumb|right|300px|Prompting user to enter data via the '''read -p''' command storing into '''user-created variable'''.]]
# Issue the '''chmod''' command to add '''execute permissions''' for the user <br>for the '''user-variables.bash''' file.<br><br># Issue the following to run the user-variables.bash Bash shell script<br> (enter '''your Full name''' and '''your age''' when prompted):<br><span style="color:blue;font-weight:bold;font-family:courier;">./user-variables.bash</span><br><br>What did you notice?<br><br>
# Use a text editor to '''modify''' your Bash shell script called '''user-variables.bash'''<br><br>
# '''Insert''' the following lines immediately <u>'''below'''</u> the '''she-bang''' line:<br><span style="font-family:courier;font-weight:bold;">age=25<br>readonly age</span><br><br>
# Save your editing changes and exit your text editor.<br><br>[[Image:user-variable2.png|thumb|right|330px|Trying to change the value of a '''read-only''' variable'''.]]
# Issue the following to run the user-variables.bash Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">./user-variables.bash</span><br><br>What do you notice when you try to change the age variable? Why?<br><br>A '''positional parameter''' is a special variable within a shell program; its value is set from '''arguments''' contained in a shell script or using the set command.<br>Let's use '''positional parameters''' and '''special parameters''' in a Bash shell script.<br><br>
# Use a text editor to create a file called '''parameters.bash'''<br><br>
# Add the following lines to the beginning of this file:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>echo \$0: $0<br>echo \$2: $2<br>echo \$3: $3<br><br>echo \$#: $#<br>echo \$*: $*<br><br>shift 2<br>echo \$#: $#<br>echo \$*: $*</span><br><br>
:In the next investigation, you will learn to use '''command substitution''' and '''math operations''' in your shell scripts.
<br>
=INVESTIGATION 3: COMMAND SUBSTITUTION / MATH OPERATIONS=
<br>In this sectioninvestigation, you will learn how to use '''command substitution''' and '''math operations''' in your shell scripts.
Let's create a Bash shell script that uses command substitution that displays<br>'''text''' and values of '''environment variables''' in a series of <span style="font-family:courier;font-weight:bold;">echo</span> statements.<br><br>
'''Perform the Following Steps:'''
# Add the following lines to the beginning of this file:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>echo<br>echo "MY ACCOUNT INFORMATION:"<br>echo<br>echo "Username: $(whoami)"<br>echo<br>echo "Current Directory: $(pwd)"<br>echo<br></span><br>[[Image:commandsubstitution1.png|thumb|right|275px|Output of a shell script using command substitution.]]
# Save your editing changes and exit your text editor.<br><br>
# Issue the '''chmod''' command to add execute permissions for the user <br>for the '''command-substitution.bash''' file.<br><br>
# Issue the following to run the user-variables.bash Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">./command-substitution.bash</span><br><br>Confirm that your shell script displays the correct information for your Matrix account.<br><br>
'''Math Operations'''
Since you do NOT have to declare the '''data-type''' of a variable (as opposed to compiled program <br>such as the C-programming language),<br> numbers would be stored as '''text''' in variables. <br>Therefore, it is important to use the construct <span style="color:blue;font-family:courier;font-weight:bold">(( ))</span> to <u>convert</u> numbers (stored as ''text'') into '''numbers'''.
We will now learn how to use this construct in order to perform math operations for shell scripts.
<br><br>
'''Perform the Following Steps:'''
# Confirm that you are located in your '''home''' directory in your Matrix account.<br><br>Let's demonstrate that the Unix/Linux shell stores numbers as ascii text<br>which can cause problems when performing math operations.<br><br># To demonstrate the need for the '''( )''' construct, issue Issue the following Linux command from the shell:<br><span style="color:blue;font-family:courier;font-weight:bold">echo "1 + 2"</span><br><br>What did you notice?<br><br># Issue To demonstrate the need for the '''(( ))''' construct, issue the following Linux commands (using the ''math construct''):<br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((1 + 2))"</span><br><br>What did you notice?<br>The <span style="font-family:courier;font-weight:bold">(( ))</span> construct converted values '''1''' and '''2''' from ''text'' to '''binary numbers'''.<br>The '''$''' in front of the construct '''expands''' the result of the calculation.<br><br># Issue the following Linux commands demonstrating other types of math calculations:<br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((2 - 3))"</span><br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((2 * 3))"</span><br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((2 / 3))"</span><br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((2 ** 3))"</span><br><br>'''NOTE:''' You may notice that '''dividing''' '''2''' by '''3''' shows a '''zero''' result. To perform decimal calculations would require<br>the use the '''awk''' or '''bc''' Linux commands (we will '''NOT''' cover that method to work with ''decimal numbers '' in this course).<br><br>You can use the ''math construct'' with variables as well.<br><br># Issue the following Linux commands demonstrating using the ''math construct'' with '''variables''':<br><span style="color:blue;font-family:courier;font-weight:bold">num1=34</span><br><span style="color:blue;font-family:courier;font-weight:bold">num2=12</span><br><span style="color:blue;font-family:courier;font-weight:bold">echo "$((num1 * num2))"</span><br><br>What did you notice?<br><br>You can create variables and assign them values in the ''math construct'' as well.<br><br># Issue the following Linux commands demonstrating using the math construct with '''variables''':<br><span style="color:blue;font-family:courier;font-weight:bold">num1=5</span><br><span style="color:blue;font-family:courier;font-weight:bold">num2=3</span><br><span style="color:blue;font-family:courier;font-weight:bold">((result = num1 ** num2))</span><br><span style="color:blue;font-family:courier;font-weight:bold">echo "The result is: $result"</span><br><br>
# Use a text editor to create a Bash shell script called '''dog-years.bash'''<br><br>
# Add the following lines to the beginning of this file:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>echo<br>dogFactor=7<br>read -p "Please enter your age (in years): " humanYears<br>((dogYears = humanYears * dogFactor))<br>echo "You age in dog-years is: $dogYears"<br>echo<br></span><br>
# Save your editing changes and exit your text editor.<br><br>[[Image:mathops1.png|thumb|right|275px|Output of a shell script with math operations using the '''math construct'''.]]
# Issue the '''chmod''' command to add execute permissions <br>for the user for the '''dog-years.bash''' file.<br><br># Issue the following to run the '''user-variables.bash ''' Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">./dog-years.bash</span><br><br>Enter <u>your</u> age to see what happens.<br><br># Issue the following Linux command to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">bash /home/murray.saul/myscripts~uli101/week10-check-3 | more</span><br><br>If you encounter errors, make corrections and '''re-run''' the checking script until you<br>receive a congratulations message, then you can proceed.<br><br>
:In the next investigation, you will use '''control-flow statements''' to allow your shell scripts <br>to perform differently under different situations. =INVESTIGATION 4: USING CONTROL FLOW STATEMENTS = In this section, you will learn how to use control-flow statements to make your shell script behave differently under different situation.<br><br>
=INVESTIGATION 4: CONTROL FLOW STATEMENTS =
<br>
In this investigation, you will learn how to use '''control-flow statements'''<br>to make your shell script ''behave differently'' under ''different situations or conditions''.
'''Perform the Following Steps:'''
# Confirm that you are located in your '''home''' directory in your Matrix account.<br><br>
# Issue the following linux Linux commands at the Bash shell prompt to assign values to several variables:<br><span style="color:blue;font-weight:bold;font-family:courier;">course="ULI101"<br>number1=5<br>number2=10</span><br><br>You can test conditions by issuing '''Linux commands / pipeline commands''' <u>or</u><br>by using the '''test''' command. We will demonstrate using the '''test''' command in this tutorial,<br>and then we will demonstrate how to test by issuing a ''Linux command / pipeline command'' in a <u>later</u> tutorial.<br><br># Issue the following linux Linux command to test a condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course = "ULI101"</span><br><br>The '''$?''' variable is used to store an '''exit status ''' of the <u>previously -issued</u> command issued (including the test command).<br>If the exit status is '''zero''', then it indicates a ''TRUE '' value and if the status is '''non-zero''', then it indicates a ''FALSE '' value.<br><br># Issue the following linux Linux command to view the '''exit status ''' of the previously-issued '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>Based on its the ''exit status'' value, is the result ''TRUE '' or ''FALSE''?<br><br># Issue the following linux Linux command to test another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course = "uli101"</span><br><br># Issue the following linux Linux command to view the ''exit status '' of the previously-issued '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>Based on the ''exit status'' value, is the result TRUE or FALSE?<br>The value is non-zero (FALSE) since UPPERCASE characters <br>are different than lowercase characters.<br><br># Issue the following linux Linux command to test another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course != "uli101"</span><br><br># Issue a linux command to display the value of '''$?'''. <br><br>What is the result? Why?<br><br># Issue the following linux Linux command to test a condition involving numbersearlier assigned variables:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $number1 > $number2</span><br><br># Issue a linux Linux command to display the value of '''$?'''. <br><br>'''NOTE:''' You will notice that something is '''wrong'''.<br>The exit status '''$?''' shows a zero (TRUE) value, but the number 5 is definitely NOT greater than 10.<br>The problem is that the symbols '''<''' and '''>''' are interpreted as REDIRECTION symbols!<br><br># To prove this, issue the following linux Linux command :<br><span style="color:blue;font-weight:bold;font-family:courier;">ls -l 10</span><br><br>You should notice a file called "'''10'''". The incorrectly issued '''test''' command '''used redirect redirection'''<br>to create an '''empty ''' file instead,<br> which indeed succeeded just giving and assigning the exit status variable a ''TRUE '' value!<br><br>To prevent problems when issuing the '''test''' command when comparing numbers, <br>you can use the following '''test options''':<br>'''-lt''' (<), '''-le''' (<=), '''-gt''' (>), '''-ge''' (>=;), '''-eq''' (=), '''-ne''' (!=)<br><br># Issue the correct linux Linux command to '''properly ''' test both values:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $number1 -gt $number2</span><br><br># Issue a linux Linux command to display the value of '''$?'''.<br><br>You should notice that the exit status value is now ''FALSE '' which is the correct result.<br><br># The '''test''' command can be abbreviated substituted by the '''square brackets ''' '''[ ]''' which contains the '''test''' condition<br>within the square brackets. You need to have spaces between the brackets and the test condition;<br>otherwise, you will get a test error.<br><br>
# To generate a '''test error''', copy and paste the following '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">[$number1 -gt $number2]</span><br><br>The reason for the error was that you need '''spaces''' between the '''square brackets''' and the '''test condition'''.<br><br>
# Copy and paste the following (correct) '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">[ $number1 -gt $number2 ]</span><br><br>
# Issue a command to view the value of the '''exit status''' of the previously issued '''test''' command.<br>You should notice that is works properly.<br><br>Now that we have learned how to test conditions, let's learn about '''control-flow''' statements.<br><br>'''Logic statementsLOGIC STATEMENTS''' are used to create '''different paths''' or directions that the shell script will take<br>based on the <u>result</u> of the '''test condition'''. In this tutorial,<br>we will only focus on the '''if''' and '''if-else''' logic statementstatements.<br><br># Use a text editor like vi or nano to create the text file called '''if-1.bash''' <br>(eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-1.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>num1=5<br>num2=10<br>if [ $num1 -lt $num2 ]<br>then<br> echo "num1 is less than num2"<br>fi</span><br><br>
# Save your editing session and exit the text editor <br>(eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br>[[Image:if-1.png|thumb|right|200px|Output of a shell script using the '''if''' control-flow statement.]]# Issue the following linux Linux command to add execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if-1.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./if-1.bash</span><br><br>Confirm that the output indicated indicates a correct result.<br><br># Use a text editor like vi or nano to create the text file called '''if-2.bash''' <br>(eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-2.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]<br>then<br> echo "The first number is greater than the second number."<br>fi</span><br><br>
# Save your editing session and exit the text editor <br>(eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br>[[Image:if-2.png|thumb|right|320px|Output of a shell script using the '''read''' command and the '''if''' control-flow statement.]]# Issue the following linux Linux command to add execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if-2.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./if-2.bash</span><br><br>Confirm When prompted, make certain that the output indicated a correct result'''first number'''<br>is <u>greater than</u> the '''second number'''. What happens?<br><br># Run the <span style="font-weight:bold;font-family:courier;">./if-2.bash</span> Bash shell script again.<br><br>What happens when you enter a When prompted, make certain that the '''first number that '''<br>is <u>less than or equal to </u> the '''second number'''. What happens? <br><br>Let's use an '''if-else''' statement to provide an appropriate '''alternative'''<br>if the condition first number is FALSEless than or equal to the second number.<br><br># Use a text editor like vi or nano to create the text file called '''if-3.bash''' <br>(eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-3.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold">#!/bin/bash<br>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]<br>then<br> echo "The first number is greater than the second number."<br>else<br> echo "The first number is less than or equal to the second number."<br>fi</span><br><br>[[Image:if-3.png|thumb|right|330px|Output of a shell script using the '''if-else''' control-flow statement.]]# Save your editing session and exit the text editor <br>(eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br>[[Image:if-3.png|thumb|right|330px|Output of a shell script using the '''if-else''' control-flow statement.]]# Issue the following linux Linux command to add execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if-3.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./if-3.bash</span><br><br>What do you notice? Try running the script several times with numbers '''different ''' and '''equal '''<br>to each other to confirm that the shell script works correctly.<br><br>Let's learn how to use ''LOOP STATEMENTS''' are a simple series of steps or sequence of statements executed<br>repeatedly zero or more times satisfying the given condition is satisfied.''<br>Reference: https://www.chegg.com/homework-help/definitions/loop with shell scripting. In this tutorial-statement-3<br><br>There are several loops, but we will only focus on one simple use with the look at a '''for''' loopusing a '''list'''.<br><br># Use a text editor like vi or nano to create the text file called '''for-1.bash''' <br>(eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi for-1.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>echo<br>for x in 5 4 3 2 1<br>do<br> echo $x<br>done<br>echo "blast-off!"<br>echo</span><br><br>
# Save your editing session and exit the text editor <br>(eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br>[[Image:for-1.png|thumb|right|125px|Output of a shell script using the '''for''' loop with a '''list'''.]]# Issue the following linux Linux command to add execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x for-1.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./for-1.bash</span><br><br># Use a text editor like vi or nano to create the text file called '''for-2.bash''' <br>(eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi for-2.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>echo<br>for x<br>do<br> echo $x<br>done<br>echo "blast-off!"<br>echo</span><br><br>
# Save your editing session and exit the text editor <br>(eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br># Issue the following linux Linux command to add execute permissions for your shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x for-2.bash</span><br><br>[[Image:for-2.png|thumb|right|175px|Output of a shell script using the '''for''' loop <u>without</u> a '''list'''.]]# Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./for-2.bash 10 9 8 7 6 5 4 3 2 1</span><br><br>How does this differ from the previous shell script?<br><br>You will learn in a couple of weeks more examples of using loop statements.<br><br>Let's run a '''checking-script''' to confirm that both your '''for-1.bash''' and '''for-2.bash'''<br>Bash shell scripts exist, have execute permissions, and when run, produce<br>the same OUTPUT as required in this tutorial's instructions.<br><br># Issue the following Linux command to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">bash /home/murray.saul/myscripts~uli101/week10-check-4 | more</span><br><br># If you encounter errors, make corrections and '''re-run''' the checking script until you<br>receive a congratulations message, then you can proceed.<br><br>Let's create a Bash shell script that contain '''user-created variables'''.<br><br>
# After you complete the Review Questions sections to get additional practice, then work on your '''online assignment 3''',<br>'''sections 2 and 3''' labelled '''Interactive Shell Environment''' and '''Introduction To Scripting (phone)'''.<br><br>
# Write a Bash shell script that clears the screen and displays the text Hello World on the screen.<br><br>What '''permissions ''' are required to run this Bash shell script?<br><br>What are the different ways methods that you can run this Bash shell script from the command line?<br><br># Write a Bash shell script that clears the screen, prompts the user for their '''full name''' and then prompts the user for their '''age''',<br>then clears the screen again and welcomes the user by their name and tells them their age.<br><br>What '''comments ''' would you add to the above script’s contents to properly document this Bash shell script to be understood<br>for those users that would read / edit this Bash shell script’s contents?<br><br># Write a Bash shell script that will first set the value of a read-only variable called '''numberdogFactor''' to '''23''' and make this variable '''read-only7'''.<br>Then the The script will then clear the screen and prompt the user to enter a value for that variable called number to another value.<br>Have the script display the value age of the a dog in human years (which will be stored into a variable called number to prove that it is a read-only variable'''humanYears''').<br><br>When you ran this Bash shell The script, did you encounter an error message?will store in a variable called '''dogYears''' the value of ''humanYears x dogFactor''<br>How would you run this Bash shell The script, so will then clear the screen a second time and then display the age of the error message was NOT displayed?dog in ''“dog years”''.<br><br># Write a Bash shell script that will clear the screen and then display all '''arguments ''' that were entered <u>after </u> your Bash shell script when it was run. Also have the Bash shell script display the '''number of arguments ''' that were entered after your Bash shell script.<br><br><br>
'''PART B: WALK-THRUS'''
</pre>
:WRITE ROUGH WORK AND OUTPUT FROM ISSUING:
:'''./walkthru1.bash'''
:ROUGH WORK:
:OUTPUT:
</pre>
:WRITE ROUGH WORK AND OUTPUT FROM ISSUING:
:'''./walkthru2.bash apple orange banana'''
:ROUGH WORK:
:OUTPUT:
<br><br>
:'''Walkthru #3:'''
:'''cat walkthru2.bash'''
<pre>
#!/usr/bin/bash
for x in 1 2 3 4 5
do
if [ $((x % 2)) -eq 0 ]
then
echo "this"
else
echo "that"
fi
done
</pre>
:WRITE ROUGH WORK AND OUTPUT FROM ISSUING:
:'''./walkthru3.bash apple orange banana'''
:ROUGH WORK:
:OUTPUT:
[[Category:ULI101]]