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>
===Tutorial Reference Material===
* [https://opensource.com/article/19/8/what-are-environment-variables Environment]
* [https://www.linuxtechi.com/variables-in-shell-scripting/#:~:text=User%20Defined%20Variables%3A,like%20a%20real%20computer%20program. User Defined]
* [http://osr600doc.xinuos.com/en/SDK_tools/_Positional_Parameters.html#:~:text=A%20positional%20parameter%20is%20a,up%20to%20nine%20positional%20parameters. Positional Parameters]Commands/ Techniques
* [http://linuxcommand.org/lc3_man_pages/readh.html read]
* [https://man7.org/linux/man-pages/man1/readonly.1p.html readonly]
* [https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html Command Substitution]
| style="padding-left:15px;"|Control Flow Statements
* [https://en.wikipedia.org/wiki/Control_flow Purpose]
* [https://www.computerhope.com/unix/test.htm test command]
* [https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php#:~:text=If%20statements%20(and%2C%20closely%20related,conditions%20that%20we%20may%20set. if statement]
* [https://www.tutorialspoint.com/unix/if-else-statement.htm if-else statement]
* [https://www.cyberciti.biz/faq/bash-for-loop/#:~:text=A%20'for%20loop'%20is%20a,files%20using%20a%20for%20loop. for loop]
= 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 line to run in a '''specific shell''', which could prevent errors in the scripts starts with the case an older shell does not recognize<br>newer features from more recent shells.<span style="font-family:courier;font-weight:bold"br>#!</spanbr> characters and the path The '''she-bang''' line is a '''special comment''' at top of your shell script to the Bash interpreterrun your shell script<br>in a specific shell. <ibr><br>This sequence of characters (#!) is called '''NOTE:''' The '''shebangline''' and is used to tell the operating system<bru>must</u>which interpreter to use to parse appear on the '''first line''' and at the rest '''beginning''' of the fileshell script,<br>otherwise, it will be treated as a regular comment and ignored. </ibr><br>Reference: https://linuxize.com/post/bash-shebang/
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>
[[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> Reference: https://en.wikipedia.org/wiki/Command_substitution<br><br> ''Usage:'' <span style="font-family:courier"><b>command1 $(command2)</b><br>or<br><b>command1 `command2`</b></span><br><br> ''Examples:'' <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>
Refer to the diagram to the right for using the '''Logic Statementsif logic statement'''with the '''test''' command. <br><br><br><br><br>'''if-else statement:'''<br>[[Image:logic-2.png|thumb|right|210px|Example of how an '''if-else''' control-flow statement.]]
<pre style="width:20%">
if test condition
then
command(s)
else
command(s)
fi
</pre>
'''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=
<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 '''sedhello''' 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/scriptsmyscripts/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/scriptsmyscripts/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 <br> :In the next investigation, you notice?will learn to use '''command substitution''' and '''math operations''' in your shell scripts.<br> =INVESTIGATION 3: COMMAND SUBSTITUTION / MATH OPERATIONS=<br>In this investigation, you will learn how to use '''command substitution''' and '''math operations''' in your shell scripts.
<span style="font-family:courier;font-weight:bold;">echo "The current date and time is: $(date)"</span>
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>
# Issue the following linux commands at the Use a text editor to create a Bash shell prompt to assign values to several variables:script called '''command-substitution.bash'''<br><span style="colorbr># Add the following lines to the beginning of this file:blue;<br><span style="font-weightfamily:boldcourier;font-familyweight:courierbold;">course="ULI101"#!/bin/bash<br>number1=5echo<br>number2=10echo "MY ACCOUNT INFORMATION:"<br>echo</spanbr>echo "Username: $(whoami)"<br>echo<br># Issue the following linux command to test a conditionecho "Current Directory:$(pwd)"<br>echo<br></span style="color:blue;font-weight:bold;font-family:courier;">test $course = "ULI101"</span><><br><br>The ''[[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''' variable is used command to store an exit status of the previously command issued (including add execute permissions<br>for the test command). If the status is '''zerocommand-substitution.bash''', then it indicates a TRUE value and if file.<br><br># Issue the following to run the status is '''nonuser-zero''', then it indicates a FALSE valuevariables.bash Bash shell script:<br><br># Issue the following linux command to view the status of the previously-issued '''test''' command:<br><span style=span style="color:blue;font-weight:bold;font-family:courier;">echo $?./command-substitution.bash</span><br><br>Based on its value, is Confirm that your shell script displays the result TRUE or FALSE?correct information for your Matrix account.<br><br># Issue '''Math Operations''' Since you do NOT have to declare the following linux command '''data-type''' of a variable (as opposed to test another condition: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-weightfamily:boldcourier;font-familyweight:courier;bold">test $course = "uli101"(( ))</span>to <bru>convert<br/u># Issue the following linux command to view the status of the previously-issued numbers (stored as ''text'') into '''testnumbers''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?. We will now learn how to use this construct in order to perform math operations for shell scripts.</spanbr><br>'''Perform the Following Steps:''' # Confirm that you are located in your '''home''' directory in your Matrix account.<br>The value is non-zero (FALSE) since UPPERCASE characters are different than lowercase characters<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 Linux command to test another conditionfrom the shell:<br><span style="color:blue;font-weightfamily:boldcourier;font-familyweight:courier;bold">test $course != "uli101echo "1 + 2"</span><br><br># Issue a linux command to display the value of '''$?'''. What is the result? Whydid you notice?<br><br># Issue To demonstrate the need for the following linux command to test a condition involving numbers'''(( ))''' construct, issue the following Linux commands (using the ''math construct''):<br><span style="color:blue;font-weightfamily:boldcourier;font-familyweight:courier;bold">test echo "$number1 > $number2((1 + 2))"</span><br><br># Issue a linux command to display the value of '''$What did you notice?<br>The <span style="font-family:courier;font-weight:bold">(( ))</span> construct converted values '''. '''NOTE:''' You will notice that something is 1'''wrongand '''.<br>The exit status 2'''$?from ''text'' to '''binary numbers''' shows a zero (TRUE) value, but the number 5 is definitely NOT greater than 10.<br>The problem is that the symbols '''<$''' and in front of the construct '''>expands''' are interpreted as REDIRECTION symbols!the result of the calculation.<br><br># To prove this, issue Issue the following linux command Linux commands demonstrating other types of math calculations:<br><span style="color:blue;font-weightfamily:boldcourier;font-familyweight:courier;bold">ls 10echo "$((2 - 3))"</span><br><brspan style="color:blue;font-family:courier;font-weight:bold">You should notice a file called echo "'''10'''$((2 * 3))". The incorrectly issued '''test''' command used redirect to create an empty file instead,<br</span> which indeed succeeded just giving a TRUE value!<br><br>To prevent problems when issuing the '''test''' command when comparing numbers, you can use the following optionsspan style="color:blue;font-family:courier;font-weight:bold">echo "$((2 / 3))"</span><br>'''<span style="color:blue;font-lt''' (<family:courier;), '''font-le''' weight:bold">echo "$((<=2 ** 3)), "</span><br><br>'''NOTE:'''-gtYou may notice that '''dividing' (>), '''-ge''2' (>=;), '' by '''-eq3''' (=), shows a '''-nezero''' (!=)result. To perform decimal calculations would require<br><br># Issue the correct linux command use the '''awk''' or '''bc''' Linux commands (we will '''NOT''' cover that method to properly test both values:work with ''decimal numbers'' in this course).<br><span style="color:blue;font-weight:bold;font-family:courier;"br>test $number1 -gt $number2You can use the ''math construct'' with variables as well.</span><brbr><br># Issue a linux command to display the value of following Linux commands demonstrating using the ''math construct'' with '''$?variables'''.:<br>You should notice that the exit status value is now FALSE which is the correct result.<brspan style="color:blue;font-family:courier;font-weight:bold">num1=34</span><br># The '''test''' command can be abbreviated by the square brackets '''[<span style="color:blue;font-family:courier; ]''' which contain 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.font-weight:bold">num2=12</span><br><br># To generate a '''test error''', copy and paste the following '''test''' commandspan style="color:blue;font-family:<br><span style="color:bluecourier;font-weight:bold;font-family:courier;">[echo "$number1 -gt $number2]((num1 * num2))"</span><br><br>You should What did you notice an test error message.?<br><br># Copy You can create variables and paste assign them values in the following (correct) ''math construct'test' as well.<br><br># Issue the following Linux commands demonstrating using the math construct with '''variables''' command:<br><span style="color:blue;font-weightfamily:boldcourier;font-familyweight:courier;bold">[ $number1 num1=5</span><br><span style="color:blue;font-gt $number2 ]family:courier;font-weight:bold">num2=3</span><br><br>Issue a command to view the value of the exit status of the previously issued '''test''' command. You should notice that is works properly.span style="color:blue;font-family:courier;font-weight:bold">((result = num1 ** num2))<br/span><br>'''Let's now learn about control<span style="color:blue;font-flow statementsfamily:'''<courier;font-weight:bold">echo "The result is: $result"</span><br><br># Use a text editor to create a Bash shell script called '''Logic statementsdog-years.bash''' are used to create different paths or directions based on <br><br># Add the following lines to the result beginning of testing conditions. In this tutorial, we will only focus on the '''if''' logic statement.file:<br><br># Use a text editor like vi or nano to create the text file called '''ifspan style="font-1.bash''' (eg. <span style="colorfamily:bluecourier;font-weight:bold;font-family:courier;">vi if-1.">#!/bin/bash</spanbr>)echo<br>dogFactor=7<br>If you are using the nano text editor, refer to notes on text editing read -p "Please enter your age (in a previous week in the course schedule.years): " humanYears<br>((dogYears = humanYears * dogFactor))<br># Enter the following lines echo "You age in your shell scriptdog-years is:$dogYears"<br>echo<br></span style="font-family:courier;">#!/bin/bash<br>clear# Save your editing changes and exit your text editor.<br>num1=5<br>num2=10<br>if [ $num1 -gt $num2 ]<br>then[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> echo "Greater Than"<br>fi</span>for the user for the '''dog-years.bash''' file.<br><br># Save your editing session and exit Issue the following to run the text editor (eg. with vi: press '''ESC''', then type user-variables.bash'''Bash shell script:wx''' followed by '''ENTER''').<br><br># Issue the following linux command to add execute permissions for your shell script:<br><span style="color:blue;span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if./dog-1years.bash</span><br><br># Run Enter <u>your shell script by issuing: </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;">bash /home/murray.saul/myscripts/ifweek10-check-1.bash3 | more</span><br><br>Confirm that If you encounter errors, make corrections and '''re-run''' the output indicated checking script until you<br>receive a correct resultcongratulations message, then you can proceed.<br><br># Use a text editor like vi or nano to create the text file called :In the next investigation, you will use '''ifcontrol-2.bashflow statements''' (egto allow your shell scripts<br>to perform differently under different situations. <span stylebr><br> ="colorINVESTIGATION 4:blue;font-weight:bold;font-family:courier;">vi if-2.bash</span>)CONTROL FLOW STATEMENTS =<br><br>If In this investigation, you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.will learn how to use '''control-flow statements'''<br><br># Enter the following lines in to make your shell script''behave differently'' under ''different situations or conditions''. '''Perform the Following Steps:'''<br><span style="font-family:courier;">#!/bin/bash<br>clear<br>read -p "Enter the first number: " num1# Confirm that you are located in your '''home''' directory in your Matrix account.<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]# Issue the following Linux commands at the Bash shell prompt to assign values to several variables:<br>then<br> span style="color:blue; font-weight:bold; echo font-family:courier;">course="The first number is greater than the second number.ULI101"<br>finumber1=5<br>number2=10</span><br><br># Save your editing session and exit the text editor (eg. with vi: press You can test conditions by issuing '''Linux commands / pipeline commands''ESC'<u>or</u><br>by using the '', then type 'test'':wx'command. We will demonstrate using the '' followed by 'test'''command in this tutorial,<br>and then we will demonstrate how to test by issuing a 'ENTER'Linux command / pipeline command'')in a <u>later</u> tutorial.<br><br># Issue the following linux Linux command to add execute permissions for your shell scripttest a condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x if-2.bashtest $course = "ULI101"</span><br><br># Run your shell script by issuing: <span style="color:blue;font-weight:bold;font-family:courier;"The '''$?''' variable is used to store an '''exit status''' of the <u>./ifpreviously-2.bashissued</spanu><br><br>Confirm that command (including the output indicated a correct resulttest command).<br><br>What happens when you enter a first number that If the exit status is less than or equal to the second number? We will learn about if-else and if-elif-else statements in '''zero''', then it indicates a couple of weeks.<br><br>''TRUE''Loop statementsvalue and if the status is ''' are used to provide repetition in a shell script. In this tutorial, we will only focus on the non-zero''', then it indicates a 'for'FALSE'' loop statementvalue.<br><br># Use a text editor like vi or nano to create Issue the text file called following Linux command to view the '''exit status'''forof the previously-1.bashissued '''test''' (eg. command:<br><span style="color:blue;font-weight:bold;font-family:courier;">vi for-1.bashecho $?</span>)<br><br>If you are using Based on the nano text editor''exit status'' value, refer to notes on text editing in a previous week in is the course schedule.result ''TRUE'' or ''FALSE''?<br><br># Enter Issue the following lines in your shell scriptLinux command to test another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">#!test $course = "uli101"</bin/bash<brspan>echo<br>for x in 5 4 3 2 1<br>do# Issue the following Linux command to view the ''exit status'' of the previously-issued '''test''' command:<br> <span style="color:blue;  font-weight:bold;echo $x<br>done<br>echo "blastfont-off!family:courier;"<br>echo$?</span><br><br># Save your editing session and Based on the ''exit the text editor (eg. with vi: press '''ESC'status''value, then type ''':wx''' followed by '''ENTER''').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 add execute permissions for your shell scripttest another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x for-1.bashtest $course != "uli101"</span><br><br># Run your shell script by issuing: Issue a linux command to display the value of '''$?'''<br><span style="colorbr>What is the result? Why?<br><br># Issue the following Linux command to test a condition involving earlier assigned variables:<br><span style="color:blue;font-weight:bold;font-family:courier;">.test $number1 > $number2</for-1.bash</spanspan><br><br># Use Issue a text editor like vi or nano Linux command to create display the text file called value of '''for-2.bash$?''' (eg. <span style="colorbr><br>'''NOTE:blue;font-weight:bold;font-family:courier;">vi for-2''' You will notice that something is '''wrong'''.bash</spanbr>The exit status '''$?''' shows a zero (TRUE)value, but the number 5 is definitely NOT greater than 10.<br><br>If you are using The problem is that the nano text editor, refer to notes on text editing in a previous week in the course schedule.symbols '''<''' and '''>''' are interpreted as REDIRECTION symbols!<br><br># Enter To prove this, issue the following lines in your shell scriptLinux command :<br><span style="color:blue;font-weight:bold;font-family:courier;">#!ls -l 10</bin/bash<br>echo<brspan>for x<br>do<br> echo $xYou should notice a file called "'''10'''". The incorrectly issued '''test''' command '''used redirection'''<br>done<br>echo "blast-offto create an '''empty''' file and assigning the exit status variable a ''TRUE'' value!"<br>echo</span><br><br># Save your editing session and exit the text editor (eg. with vi: press To prevent problems when issuing the '''ESCtest'''command when comparing numbers, then type <br>you can use the following ''':wxtest options''' followed by :<br>'''ENTER-lt'''(<).<br><br>, '''-le''' (<&# Issue the following linux command to add execute permissions for your shell script:<br><span style="color:blue61;), '''-gt''' (>font), '''-weight:boldge''' (>=font-family:courier;">chmod u+x for), '''-2.bash</span><br><br>eq''' (&# Run your shell script by issuing61;), '''-ne''' (!=)<br><br># Issue the correct Linux command to '''properly''' test both values: <br><span style="color:blue;font-weight:bold;font-family:courier;">./fortest $number1 -2.bash 10 9 8 7 6 5 4 3 2 1gt $number2</span><br><br>How does this differ from # Issue a Linux command to display the previous shell scriptvalue of '''$?'''.<br><br>You will learn in a couple of weeks more examples of using loop statementsshould notice that the exit status value is now ''FALSE'' which is the correct result.<br><br>Let# The ''s run a 'test''checking-script' command can be substituted by '''square brackets''' to confirm that both your '''for-1.bash[ ]''' and which contains the '''for-2.bashtest'''condition<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;fontwithin 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 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,we will only focus on the '''if''' and '''if-else''' logic statements.<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># 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 ''':x''' 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 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 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># 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 ''':x''' 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 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>When prompted, make certain that the '''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> When prompted, make certain that the '''first number'''<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 '''alternative'''<br>if the first number is less 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># 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 ''':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>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><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/week10-check-3 ">bash /home/murray.saul/myscripts/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>