13,420
edits
Changes
no edit summary
<br>
===Main Objectives of this Practice Tutorial===
:* Plan and create a Shell Script
:* Explain the purpose of the '''she-bang line''' contained at the top of a shell script.
:* List rules for naming a Bash script fileSet '''permissions''' and '''execute''' shell scripts.
:* Explain how to set Use '''permissionsenvironment''' and how to '''executeuser-defined''' a variables in shell scriptscripts.
:* Explain the purpose of Use '''environmentCommand Substitution''' and '''user-definedMath Operations''' variables. :* Explain the purpose of '''control flow statements'''.in shell scripts
:* Explain the purpose of the '''$?''' exit status and the '''test''' command.
:* Explain the purpose and usage of the Use '''if''' and '''if-else''' logic statementsin shell scripts.
:* Explain the purpose and usage of the Use a '''for''' loop statementwith a list in shell scripts.
<br><br>
= KEY CONCEPTS =
===Creating & Executing Shell Scripts===
'''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.]]If you are learning Bash scripting by reading other people’s code you might Since Linux shells have noticedevolved over a period of time, using a she-bang line '''forces''' the shell script<br>that the first 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 the scripts starts with the a specific shell.<br><span style="font-familybr>'''NOTE:courier;font-weight:bold"''' The '''shebang line''' <u>#!must</spanu> characters appear on the '''first line''' and at the path to '''beginning''' of the Bash interpretershell script,<br>otherwise, it will be treated as a regular comment and ignored.<br><br>
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:''Example:<br><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=== '''Definition''' ''<b>Variables</b> are used to '''store information''' to be referenced and manipulated in a computer program.<br>They also provide a way of labeling data with a descriptive name, so our programs can be understood<br>more clearly by the reader and ourselves.''<br>Reference: https://launchschool.com/books/ruby/read/variables
'''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>(you <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>'''$*''' , '''“$*”''' , '''"$@"''' , '''$#''' , '''$?'''
<br><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:''
<pre style="width:30%">num1=5;num2=10echo “$(($num1 + $num2))”15echo “$((num1-num2))”-5((product=num1*num2))echo “$product”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 CAN be used.<br>On the other hand, if you wanted to create <br>[[Image:hello0.png|thumb|right|200px|Using a file called sed, then the '''which sedtext editor''' command<br>would indicate it is already being used by to add Linux commands in to the shell and that '''sed'hello'' wouldn't be an appropriate shell script name to use.<br><br>]]# 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 from running your '''hello''' shell script (YourUserID 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 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 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/scripts~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 learnhow to<br>how to <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 scriptis running in.<br>is running within. The command within '''<span style="font-family:courier;font-weight:bold;">$( )''' </span> uses a technique known as "'''command substitution''"<br>which you will learn about in '''week 12'''.<br><br># '''Save''' your editing changes and '''exit''' your text editor.<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 change indicating changed''' 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 in "'''sh'''"<br>which represents the '''Bourneshell''' 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''' shell).<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 <u>just</u> '''filename''' (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/scripts~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>age=25<br>readonly age<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 '''<br>for the '''user for -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''' file<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>
# Save your editing changes and exit your text editor.<br><br>Notice how the quoting character "'''\'''" is used to display positional parameters like "'''$2'''"<br>as opposed to the value stored in the <u>second</u> positional parameter.<br><br>
# Issue the '''chmod''' command to add '''execute permissions ''' for the user for the '''parameters.bash''' file.<br><br>[[Image:parameter1.png|thumb|right|250px|Results from running shell script (with arguments) that use '''positional parameters''' and '''special parameters'''.]]# Issue the following to run the '''user-variables.bash''' Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">./parameters.bash</span><br><br>What happened?<br><br>The values for some of the ''positional parameters'' and ''special parameters '' may not NOT be <br>displayed properly since you did NOT provide any '''arguments ''' when <u>running the </u> your Bash shell script.<br><br># Issue the following to run the user-variables.bash Bash shell script with arguments:<br><span style="color:blue;font-weight:bold;font-family:courier;">./parameters.bash 1 2 3 4 5 6 7 8</span><br><br>What do you notice?<br><br>Take some time to view the results and how the ''parameters are '' have changed when using the '''shift ''' command. What do you notice?<br> In the next investigation, you will use control-flow statements to allow your shell scripts to perform differently under different situations.
: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.
Command Substitution is a method of running a Linux command that provides '''stdout'''<br>that is used as '''argument(s)''' for <u>another</u> Linux command.
''For example:''
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:'''
# Confirm that you are located in your '''home''' directory in your Matrix account.<br><br>
# Use a text editor to create a Bash shell script called '''command-substitution.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>echo "MY ACCOUNT INFORMATION:"<br>echo<br>echo "Username: $(whoami)"<br>echo<br>echo "Current Directory: $(pwd)"<br>echo<br>echo "Number of files in current directory: $(ls | wc -l)"<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), 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'''.
# 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># 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># 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=INVESTIGATION 4"color:blue;font-family:courier;font-weight: USING CONTROL FLOW STATEMENTS 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 to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">~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 this sectionthe next investigation, you will learn how to use '''control-flow statements ''' to make allow your shell script behave scripts<br>to perform differently under different situationsituations.<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># Issue the following linux command to You can test a condition:conditions by issuing '''Linux commands / pipeline commands''' <u>or<br/u><span style="color:blue;font-weight:bold;font-family:courier;"br>by using the '''test $course = "ULI101"</span><br><br>The '''$?''' variable is used to store an exit status of the previously command issued (including the test command). If We will demonstrate using the status is '''zerotest'''command in this tutorial, <br>and then it indicates we will demonstrate how to test by issuing a TRUE value and if the status is '''non-zeroLinux command / pipeline command''', then it indicates in a FALSE value<u>later</u> tutorial.<br><br># Issue the following linux Linux command to view the status of the previously-issued '''test''' commanda condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo test $?course = "ULI101"</span><br><br>Based on its value, The '''$?''' variable is used to store an '''exit status''' of the result TRUE or FALSE?<bru>previously-issued<br/u># Issue command (including the following linux test 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 command to view the status of the previously-issued If the exit status is '''zero''', then it indicates a ''TRUE''testvalue and if the status is '''non-zero''', then it indicates a ''FALSE'' command:value.<br><span style="color:bluebr># Issue the following 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>The Based on the ''exit status'' value , is non-zero (the result ''TRUE'' or ''FALSE) since UPPERCASE characters 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 the following Linux command to display view the value ''exit status'' of the previously-issued '''$?test'''. What is the result? Why?command:<br><br># Issue the following linux command to test a condition involving numbers:<br><span style="colorspan style="color:blue;font-weight:bold;font-family:courier;">test echo $number1 > $number2?</span><br><br># Issue a linux command to display Based on the value of ''exit status'$?'''. '''NOTE:''' You will notice that something value, is '''wrong'''.the result TRUE or FALSE?<br>The exit status '''$?''' shows a value is non-zero (TRUEFALSE) value, but the number 5 is definitely NOT greater since UPPERCASE characters<br>are different than 10lowercase characters.<br>The problem is that <br># Issue the symbols '''<''' and '''>''' are interpreted as REDIRECTION symbols!following Linux command to test another condition:<br><br># To prove this, issue the following linux command :<br><span span style="color:blue;font-weight:bold;font-family:courier;">ls 10test $course != "uli101"</span><br><br>You should notice # Issue a file called "linux command to display the value of '''10'''". The incorrectly issued '''test$?''' command used redirect to create an empty file instead,<br> which indeed succeeded just giving a TRUE value!<br>What is the result? Why?<br>To prevent problems when issuing <br># Issue the '''following Linux command to test''' command when comparing numbers, you can use the following optionsa condition involving earlier assigned variables:<br>'''<span style="color:blue;font-lt''' (<weight:bold;), '''font-le''' (<family:courier;=), ">test $number1 > $number2</span><br><br># Issue a Linux command to display the value of '''-gt$?''' (>), <br><br>'''-geNOTE:''' (>=;), You will notice that something is '''-eqwrong''' (=), .<br>The exit status '''-ne$?''' shows a zero (!=TRUE)value, but the number 5 is definitely NOT greater than 10.<br><br># Issue The problem is that the correct linux command to properly test both values:symbols '''<''' and '''>''' are interpreted as REDIRECTION symbols!<br><span stylebr># To prove this, issue the following Linux command :<br><span style="color:blue;font-weight:bold;font-family:courier;">test $number1 ls -gt $number2l 10</span><br><br># Issue You should notice a linux command to display the value of file called "''''$?10'''".<br>You should notice that the exit status value is now FALSE which is the correct result.<br><br># The incorrectly issued '''test''' command can be abbreviated by the square brackets '''[ ]used redirection'''<br>to create an '''empty''' which contain file and assigning the test condition within the square brackets. You need to have spaces between the brackets and the test condition; otherwise, you will get a test error.exit status variable a ''TRUE'' value!<br><br># To generate a prevent problems when issuing the '''test error'''command when comparing numbers, copy and paste <br>you can use the following '''testoptions''' command:<br><span style="color:blue;font'''-weight:boldlt''' (<font), '''-family:courierle''' (<">⏉$number1 ), '''-gt $number2''' (]gt;</span><br><br>You should notice an test error message.<br><br># Copy and paste the following (correct) ), '''-ge'test''' command:<br><span style="color:blue(>=font-weight:bold;font), '''-family:courier;">eq''' (⏉ $number1 ), '''-gt $number2 ne''' (!⒑</span>)<br><br># Issue a the correct Linux command to view the value of the exit status of the previously issued '''testproperly''' command. You should notice that is works properly.test both values:<br><br>'''Let's now learn about controlspan style="color:blue;font-flow statementsweight:'''bold;font-family:courier;">test $number1 -gt $number2</span><br><br># Issue a Linux command to display the value of '''Logic statements$?''' are used to create different paths or directions based on the result of testing conditions. In this tutorial, we will only focus on the '''if''' logic statement.<.<br><br># Use a text editor like vi or nano to create You should notice that the text file called exit status value is now ''FALSE''if-1which is the correct result.bash<br><br># The ''' (eg. <span style="color:bluetest''' command can be substituted by '''square brackets''' '''[font-weight:bold ]font-family:courier;">vi if-1.bash</span>)''' which contains the '''test''' condition<br><br>If you are using within the square brackets. You need to have spaces between the brackets and the nano text editortest condition;<br>otherwise, refer to notes on text editing in you will get a previous week in the course scheduletest error.<br><br># Enter To generate a '''test error''', copy and paste the following lines in your shell script'''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">&#!/bin/bash<br>clear<br>num1=5<br>num2=10<br>if [ 91;$num1 number1 -gt $num2 ]number2]</span><br>then<br> echo "Greater Than"<br>fi</span><br><br># Save your editing session and exit The reason for the text editor (eg. with vi: press error was that you need '''ESCspaces''', then type between the ''':wxsquare brackets''' followed by and the '''ENTERtest condition''').<br><br># Issue Copy and paste the following linux command to add execute permissions for your shell script(correct) '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if[ $number1 -1.bashgt $number2 ]</span><br><br># Run your shell script by issuing: Issue a command to view the value of the '''exit status''' of the previously issued '''test''' command.<span style="color:blue;font-weight:bold;font-family:courier;">./if-1br>You should notice that is works properly.bash</span><br><br>Confirm Now that the output indicated a correct resultwe have learned how to test conditions, let's learn about '''control-flow''' statements.<br><br># Use a text editor like vi or nano to create the text file called '''if-2.bashLOGIC STATEMENTS''' (eg. are used to create '''different paths''' or directions that the shell script will take<br>based on the <u>result<span style="color:blue;font-weight:bold;font-family:courier;"/u>vi if-2of the '''test condition'''. In this tutorial,we will only focus on the '''if''' and '''if-else''' logic statements.bash</span>)<br><br>If you are using the nano <br># Use a text editor, refer like vi or nano to notes on create the text editing in a previous week in the course schedulefile called '''if-1.bash'''<br>(eg. <br># Enter the span style="color:blue;font-weight:bold;font-family:courier;">vi if-1.bash</span>)<br><br># Enter the following lines in your shell script:<br><span style="font-family:courier;"font-weight:bold;">#!/bin/bash<br>clear<br>read -p "Enter the first number: " num1=5<br>read -p "Enter the second number: " num2=10<br>if [ $num1 -gt lt $num2 ]<br>then<br> echo "The first number num1 is greater less than the second number.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-21.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./if-21.bash</span><br><br>Confirm that the output indicated indicates a correct result.<br><br>What happens when you enter # Use a first number that is less than text editor like vi or equal nano to create the second number? We will learn about text file called '''if-else and if-elif-else statements in a couple of weeks2.bash'''<br>(eg. <br>'''Loop statements''' are used to provide repetition in a shell scriptspan style="color:blue;font-weight:bold;font-family:courier;">vi if-2. In this tutorial, we will only focus on the '''for''' loop statement.<bash</span>)<br><br># Use a text editor like vi or nano to create Enter the text file called '''for-1.bash''' (eg. following lines in your shell script:<br><span style="colorfont-family:bluecourier;font-weight:bold;font-family:courier;">vi for-1.#!/bin/bash</span>)<br>read -p "Enter the first number: " num1<br>If you are using read -p "Enter the nano text editor, refer to notes on text editing in a previous week in the course schedule.second number: " num2<br>if [ $num1 -gt $num2 ]<br># Enter the following lines in your shell script:then<br><span style="font-family:courier echo "The first number is greater than the second number.">#!/bin/bash<br>echofi<br/span>for x in 5 4 3 2 1<br>do<br> echo $x# Save your editing session and exit the text editor<br>done<br>echo "blast-off!"<br>echo</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''(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 forif-12.bash</span><br><br># Run your shell script by issuing: <br><span style="color:blue;font-weight:bold;font-family:courier;">./forif-12.bash</span><br><br># Use a text editor like vi or nano to create When prompted, make certain that the text file called '''for-2.bashfirst number'''<br>is <u>greater than</u> the '''second number''' (eg. What happens?<br><br># Run the <span style="color:blue;font-weight:bold;font-family:courier;">vi for./if-2.bash</span>)Bash shell script again.<br><br>If you are using the nano text editorWhen prompted, refer to notes on text editing in a previous week in make certain that the course schedule.'''first number'''<br>is <bru>less than or equal to</u># Enter the following lines in your shell script:'''second number'''. What happens?<br><span style="fontbr>Let's use an '''if-family:courier;">#!/bin/bashelse''' statement to provide an '''alternative'''<br>echo<br>for xif the first number is less than or equal to the second number.<br>do<br> echo $x<br>done<br>echo "blast# Use a text editor like vi or nano to create the text file called '''if-off!"3.bash'''<br>echo(eg. </span><br><style="color:blue;font-weight:bold;font-family:courier;">vi if-3.bash</span>)<br><br># Save Enter the following lines in your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wx''' followed by '''ENTER''').<br><br># Issue the following linux command to add execute permissions for your shell scriptshell script:<br><span style="colorfont-family:bluecourier;font-weight:bold;font-family:courier;">chmod u+x for-2.#!/bin/bash</spanbr>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br># Run your shell script by issuing: if [ $num1 -gt $num2 ]<br>then<span style="color:bluebr> font-weight:bold font-family:courier ">./for-2.bash 10 9 8 7 6 5 4 3 2 1</spanecho "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 ''':x''' followed by '''ENTER''').<br><br># Issue the following 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>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>'''LOOP STATEMENTS''' are a 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-statement-3<br><br>There are several loops, but we will look at a '''for''' loop using 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># 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 ''':x''' 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 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># 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 ''':x''' followed by '''ENTER''').<br><br># Issue the following 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/scripts;font-family:courier;">~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]]