Open main menu

CDOT Wiki β

Changes

Tutorial12: Shell Scripting - Part 2

8,242 bytes added, 20:37, 4 September 2023
no edit summary
{{Admon/caution|DO NOT USE THIS VERSION OF THE LAB. This page will no longer be updated.|'''New version here:''' https://seneca-ictoer.github.io/ULI101/A-Tutorials/tutorial12<br />'''Andrew's students please go here:''' http://wiki.littlesvr.ca/wiki/OPS145_Lab_11}}
=ADDITIONAL SHELL SCRIPTING=
<br>
===Main Objectives of this Practice Tutorial===
:* Explain how to construct '''if-else''' and Use the '''if-elif-else''' control flow statementsstatement in a shell script.
:* Explain Use the purpose of '''for''' loop control using a list with '''command substitution'''.
:* Explain how to issue Use the '''forwhile''' loop control flow statement using in a list with '''command substitution'''shell script.
:* Use the '''exit''' and '''break''' statements in a shell script. :* Explain how to configure and use the a '''.bashrc''' start-up file.
<br>
|- valign="top" style="padding-left:15px;"
|colspan="2" |Course Notes'''Slides:'''<ul><li>Week 12 Lecture 1 Notes:<br>[https://ictwiki.cdot.senecacollege.ca/~murray.saululi101/uli101slides/ULI101-Week1212.1.pdf PDF] | [https://ictwiki.cdot.senecacollege.ca/~murray.saululi101/uli101slides/ULI101-Week1212.1.pptx PPTX]</li></ul>
| style="padding-left:15px;" |Additional '''Control Flow Statements / techniques* [https://www.tutorialspoint.com/unix/if-else-statement.htm if-else]'''
* [https://www.tutorialspoint.com/unix/if-else-statement.htm if-elif-else]
* [https://www.cyberciti.biz/faq/bash-for-loop/#:~:text=A%20'for%20loop'%20is%20a,files%20using%20a%20for%20loop. for Loop]
* [https://wwwbash.gnucyberciti.orgbiz/softwareguide/bashWhile_loop while Loop]<br>'''Additional Statements:'''* [https:/manual/html_nodewww.geeksforgeeks.org/Commandexit-command-in-linux-with-Substitutionexamples/#:~:text=exit%20command%20in%20linux%20is,last%20command%20that%20is%20executed.html Using Command Substitution&text=After%20pressing%20enter%2C%20the%20terminal%20will%20simply%20close. exit]* [https://bashwww.cybercitigeeksforgeeks.bizorg/guidebreak-command-in-linux-with-examples/While_loop while Loop#:~:text=break%20command%20is%20used%20to,The%20default%20number%20is%201. break]<br><br>
| style="padding-left:15px;"|'''Startup Files:'''
* [https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html Purpose]
* [http://www.linuxfromscratch.org/blfs/view/svn/postlfs/profile.html Examples]
|colspan="1" style="padding-left:15px;" width="30%"|'''Brauer Instructional Videos:'''<ul><li>[https://www.youtube.com/watch?v=XVTwbINXnk4&list=PLU1b1f-2Oe90TuYfifnWulINjMv_Wr16N&index=6 Bash Shell Scripting - Part 2]</li></ul>
|}
= KEY CONCEPTS =
===Additional Logic Statements===
<br>
'''if-else statement:'''
<br>
[[Image:if-else.png|thumb|right|300px|Example of how an '''if-else''' 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 style="font===IF-family:courier;fontELIF-weight:bold;">num1ELSE STATEMENT===5<br>num2=10<br>if test $num1 –lt $num2<br>then<br> &nbsp;&nbsp;&nbsp;echo “Less Than”<br>else<br>echo &nbsp;&nbsp;&nbsp;“Greater Than or Equal to”<br>fi</span><br><br>
'''if-elif-else statement:'''
[[Image:if-elif-else.png|thumb|right|300px|Example of how an '''if-elif-else''' statement works.<br>(Image licensed under [https://creativecommons.org/licenses/by-sa/3.0/ cc])]]
The '''elif''' statement can be used to perform additional conditional tests of the previous test condition tests '''FALSE'''. This statement is used to make your logic control-flow statement to be more adaptable.<br><br>''How it Works:''<br>If the test condition returns a '''TRUE''' value, then the Linux Commands between<br>'''then''' and '''else''' statements are executed.<br><br>If the test returns a '''FALSE''' value, then '''a <u>new </u> condition is testedagain''',<br>and action is taken if the result is '''TRUE''', then the Linux Commands between<br>'''then''' and '''else''' statements are executed. '''Additional elif statements''' can be used if additional conditional testing is required . Eventually, an action will be taken<br>when the final test condition is '''FALSE'''.<br><br>
''Example:''
<span style="font-family:courier;font-weight:bold;">num1=5<br>num2=10<br>if test $num1 –lt $num2<br>then<br> &nbsp;&nbsp;&nbsp;echo “Less Than”<br>elif test $num1 –gt $num2<br>then<br> &nbsp;&nbsp;&nbsp;echo “Greater Than”<br>else &nbsp;&nbsp;&nbsp;echo “Equal to”<br>fi</span><br><br>
===Additional Loop Statements=FOR LOOP USING COMMAND SUBSTITUTION====
Let’s issue the '''Command Substitution:''' [[Image:for-command-substitution.png|thumb|right|300px|Example of how a '''for loop with command substitutiona ''' works.]]<i>list'''Command substitutionusing ''' 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"><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><br> '''Using the for Loop with Command Substitutionsubstitution''' Let’s issue the for loop with a list using command substitution.<br>In the example below, we will use command substitution to issue the ls command and<br>have that output (filenames) become arguments for the for loop.<br><br>
''Example:''
<span style="font-family:courier;font-weight:bold;">for x in $(ls)<br>do<br> &nbsp;&nbsp;&nbsp;echo “The item is: $x”<br>done</span><br><br>
'''While Loops:'''====WHILE LOOP====
[[Image:while-loop.png|thumb|right|170px|Example of how a '''while''' loop works.<br>(Image licensed under [https://creativecommons.org/licenses/by-sa/3.0/ cc])]]
This repeats until the condition/expression becomes '''FALSE'''.<br>Reference: https://en.wikipedia.org/wiki/While_loop<br><br>
''Example1:''
<span style="font-family:courier;font-weight:bold">answer=10<br>read –p “pick a number between 1 and 10: “ guess<br>while test $guess –eq 10<br>do &nbsp;&nbsp;&nbsp;read –p “Try again: “ guess<br>done<br>echo “You are correct”</span><br><br>
'''Mathematical Operations:''' Since you did not have to declare a data-type of a variable, user-defined variables store values as only text.This creates a problem if you want to perform math operations. In order to convert values stored as text in the shell to binary numbers, you need to use a command in order to accomplish that task.  The older method is to use the '''expr''' command.  ''Example:'' <span style="font-weight:bold;font-family:courier;">num1=5;num2=10<br>result=$(expr $num1 + $num2)<br>echo "$num1 + $num2 = $result"<br>5 + 10 = 15</span> A short-cut to convert text values to binary numbers is to contain within a double set of round brackets: '''(( ))''' ''Example:'' <span style="font-weight:bold;font-family:courier;">num1=5;num2=10<br>((result $num1 - $num2))<br>echo "$num1 - $num2 = $result"<br>5 - 10 = -5</span> Alternative Example: <span style="font-weight:bold;font-family:courier;">num1=5;num2=10<br>echo "$num1 x $num2 = $((num1 * num2))"<br>5 x 10 = 50</span> ''Example using a Loop2:''
<span style="font-weight:bold;font-family:courier;">
5
</span>
<br><br>
===Using Startup Files=EXIT &amp; BREAK STATEMENTS====<br>'''<span style="font-family:courier;font-weight:bold;">exit</span> Statement''' The '''exit''' statement is used to '''terminate''' a shell script.<br>This statement is very useful when combined with logic in a shell script.<br>The exit command can contain an argument to provide the exit status of your shell script. ''Example:'' <span style="font-family:courier;font-weight:bold">if [ $# -ne 1 ]<br>then<br>  echo "USAGE: $0 [arg]"<br>  exit 1<br>fi<br></span><br>'''<span style="font-family:courier;font-weight:bold;">break</span> Statement''' The '''break''' statement is used to '''terminate a loop'''.<br>Although the loop terminates, the shell script will continue running. ''Example:''<br><span style="font-family:courier;font-weight:bold">read -p "Enter a number: " number<br>while [ $number -ne 5 ]<br>do<br>   read -p "Try again. Enter a number: " number<br>   if [ $number -eq 5 ]<br>   then<br>     break<br>   fi<br>done<br></span><br><br> ====START-UP FILES====
'''Shell configuration (start-up) files''' are '''scripts''' that are run when you log in, log out, or start a new shell. <br>The start-up files can be used, for example, to '''set the prompt and screen display''', '''create local variables''', <br>or create temporary Linux commands ('''aliases''')
The '''/etc/profile''' file belongs to the root user and is the first start-up file that executes when you log in, regardless of shell.
User-specific config start-up files are in the user's home directory: <br><ul><li>'''~/.bash_profile''' runs when you log in .<br></li><li>The '''~/.bashrc''' runs when you start an interactive sub-Bash shell.</li></ul><br>
'''Logout Files'''
There is a file that '''resets or restores the shell environment''' (including shut-down of programs running in the shell) when the user logs out of their shell. User-specific logout start-up files are in the user's home directory: '''~/.bash_logout'''
<br><br>
=INVESTIGATION 1: ADDITIONAL LOGIC STATEMENTS=
<span style="color:red;">'''ATTENTION''': This online tutorial will be required to be completed by '''Friday in week 13 by midnight''' to obtain a grade of '''2%''' towards this course</span><br><br> In this sectioninvestigation, you will learn additional control-flow statements <br>to allow your shell scripts to be even '''more flexibleadaptable'''.
# '''Login''' to your matrix account.<br><br>
# Issue a command to '''confirm''' you are located in your home directory.<br><br>In a previous tutorial, you learned how to use the '''if''' control-flow statement. You will now learn to use the '''if-else''' statement<br>to take two different actions based on if the condition tests either TRUE or FALSE.<br><br># Use Issue a text editor like vi or nano Linux command to create the text file a directory called '''if-3.bashadvanced''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-3.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your shell script:Issue a Linux command to <bru>change<span style="font-family:courier;font-weight:bold">#!/bin/bash<br>clear<br>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]<br>then<bru>&nbsp;&nbsp;&nbsp;echo "The first number is greater than the second number."<br>else<br>&nbsp;&nbsp;&nbsp;echo "The first number is less than or equal to the second number."<br>fi</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wx''' followed by 'advanced''ENTER''')directory.<br><br># Issue the following linux a 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: <span style="color:blue;font-weight:bold;font-family:courier;">./if-3.bashconfirm</span><bru><br>What do you notice? Try running are located in the script several times with numbers different and equal to each other to<br>confirm that the shell script works correctly'''advanced''' directory.<br><br>It would be nice In '''tutorial 10''', you learned how to have a separate result of use the numbers are equal to each other'''if''' control-flow statement.<br>In order You will now learn to achieve this, you can use an the '''if-elif-else''' statement<br>to take two different actions based on if the condition tests either TRUE or FALSE.<br><br># Use a text editor like vi or nano to create the text file called '''if-4.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-4.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold">#!/bin/bash<br>clear<br>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "The first number is greater than the second number."<br>elif [ $num1 -lt $num2 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "The first number is less than the second number."<br>else<br>&nbsp;&nbsp;&nbsp;echo "The first number is equal to the second number."<br>fi</span><br><br>
# Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' 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-4.bash</span><br><br>
# Run your shell script by issuing: <span style="color:blue;font-weight:bold;font-family:courier;">./if-4.bash</span><br><br>What do you notice? Try running the script several times with numbers different and equal to each other<br>to confirm that the shell script works correctly.<br><br>A <u>classic</u> shell script to demonstrate many different paths or actions to take depending of multiple testing<br>using an '''if-elif-else''' statement would be a '''mark to letter grade converter'''.<br><br># Use a text editor like vi or nano to create the text file called '''if-5.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-5.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>clear<br>read -p "Enter a mark (0-100): " mark<br>if [ $mark -ge 80 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "You receive received an A grade."<br>elif [ $mark -ge 70 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "The receive You received a B grade."<br>elif [ $mark -ge 60 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "The receive You received a C grade."<br>elif [ $mark -ge 50 ]<br>then<br>&nbsp;&nbsp;&nbsp;echo "The receive You received a D grade."<br>else<br>&nbsp;&nbsp;&nbsp;echo "You receive received an F grade."<br>fi</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' 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-5.bash</span><br><br>
# Run your shell script by issuing: <span style="color:blue;font-weight:bold;font-family:courier;">./if-5.bash</span><br><br>What do you notice? Run several times to confirm that the shell script runs correctly for all mark (grade) categories.<br><br>
# Issue the following to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">~uli101/week12-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 more about the '''for''' loop and learn how to use the '''while''' loop for '''error-checking'''.<br><br>
=INVESTIGATION 2: ADDITIONAL LOOPING STATEMENTS =
<br>In this sectioninvestigation, you will learn more about the '''for ''' loop <br>and learn how to use the '''while''' loop for '''error-checking'''.
'''Perform the Following Steps:'''
# Use the Issue a Linux command to <u>confirm</u> you are located in your '''moreadvanced''' directory in your Matrix account.<br><br># Issue the following Linux command to view the contents of the text file called '''<span style="font-family:courier;font-weight:bold;">./for-1.bash''' (eg. </span> file:<br><span style="color:blue;font-weight:bold;font-family:courier;">more ./for-1.bash</span>)<br><br>As you should have noticed from '''tutorial 10''' that the '''for''' loop can use a '''list'''.<br>You can also use the for loop with positional parameters stored as '''arguments '''<br>from an executed shell script.<br>We will revisit this now.<br><br>You can also use the '''for ''' loop with a list using '''command substitution''' - this .<br>Using command sustitution is an effective technique method to loop within a shell script.<br><br># Before creating a new shell script, let's learn to use command substitution from the Bash Shell <br>to store arguments as positional parameters and use them for practice. <br><br># Issue the following linux command to set positional parameters in your current shell:<br><span style="color:blue;font-weight:bold;font-family:courier;">set apples oranges bananas pears</span><br><br># Issue the following linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $#</span><br><br>What do you notice? What does this value represent?<br><br># Issue the following linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $*</span><br><br>What do you notice?<br><br>These positional parameters could can be used with a for loop. To simplify things, <br>let's create another shell script that uses '''command substitution''' and within a '''for''' loop.<br><br># Use a text editor like vi or nano to create the text file called '''for-23.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi for-3.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br>
# Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>clear<br>set 10 9 8 7 6 5 4 3 2 1<br>for x<br>do<br>&nbsp;&nbsp;&nbsp;echo $x<br>done<br>echo "blast-off!"</span><br><br>
# Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br># Issue the following linux command to add '''Add execute permissions ''' for your the owner of this script and '''run this Bash shell script:'''.<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x for-3.bashbr>What do you notice?</spanbr><br><br># Run your Let's create another shell script by issuing: <span style="color:blue;font-weight:bold;font-family:courier;"to '''run a loop for each file''' that is contained in your current directory using '''command substitution'''.<br>./for<br># Use a text editor like vi or nano to create the text file called '''for-34.bash''' (eg. </span><style="color:blue;font-weight:bold;font-family:courier;">vi for-4.bash</span>)<br><br>What do you notice? How does the result differ from # Enter the following lines in your shell script called for-2.bash. Why?:<br><br>Let's create another shell script to '''run a loop for each file''' that is contained span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>clear<br>set $(ls)<br>echo "Here are files in your my current directory using '''command substitution'''.:"<br>echo<br># Use a text editor like vi or nano to create the text file called '''for-4.bash''' (eg. for x<br>do<span style=br>&nbsp;&nbsp;&nbsp;echo "color:blue&nbsp;font-weight:bold&nbsp;font-family:courier&nbsp;$x"<br>vi for-4.bashdone</span>)<br><br>If you are using # Save your editing session and exit the nano text editor, refer to notes on text editing in a previous week in the course schedule(eg.<with vi: press '''ESC''', then type ''':x''' followed by '''ENTER''').<br><br># Enter the following lines in your '''Add execute permissions''' and '''run''' this Bash shell script:.<br><br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>clearWhat do you notice?<br>set $(ls)<br>echo Here are files We can reduce a line in my current directory:"<br>echo<br>our shell script by using '''command substitution''' in the for xloop instead of using<br>do<the '''set''' command. Let's demonstrate this in another shell script.<br>&nbsp;&nbsp;&nbsp;echo <br># Use a text editor like vi or nano to create the text file called '''for-5.bash''' (eg. <span style=" &nbspcolor:blue;&nbspfont-weight:bold;&nbspfont-family:courier;$x"<br>donevi for-5.bash</span>)<br><br># Save Enter the following lines in your editing session and exit the text editor (eg. with vishell script: press '''ESC''', then type '''<br><span style="font-family:wx''' followed by '''ENTER''').courier;font-weight:bold;">#!/bin/bash<br>clear<br># Issue the following linux command to add execute permissions for your shell scriptecho "Here are files in my current directory:"<br>echo<span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x for-4.bash</span>br>for x in $(ls)<br>do<br># Run your shell script by issuing: <span style=&nbsp;&nbsp;&nbsp;echo "color:blue&nbsp;font-weight:bold&nbsp;font-family:courier&nbsp;$x"<br>./for-4.bash</span>done<br><br>What do you notice?<br/span><br>We can reduce a line in our shell script by using # Save your editing session and exit the text editor (eg. with vi: press '''command substitutionESC''' in the for loop instead of using the , then type '''set:x''' command.<br>Letfollowed by '''ENTER'''s demonstrate this in another shell script).<br><br># Use a text editor like vi or nano to create the text file called '''for-5.bashAdd execute permissions''' for this shell script and '''run Bash shell script''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi br>What do you notice? Does the output for this shell script differ from '''for-54.bash</span>)'''? Why?<br><br>If We now want to introduce you are using the nano text editor, refer to notes on text editing in a previous week in the course scheduleuse of '''error-checking'''.<br><br># Enter Use the following lines in your '''more''' command to view the previously-created Bash shell script:<br>'''./if-5.bash''' (eg. <span style="color:blue;font-familyweight:courierbold;font-weightfamily:boldcourier;">#!/binmore ./if-5.bash<br/span>clear)<br>echo Here are files in my current directory:"<br>echoTake a few moments to re-familiarize yourself with this shell script<br>for x in $(ls)<br>do# Run your shell script by issuing: <br>&nbsp;&nbsp;&nbsp;echo span style=" &nbspcolor:blue;&nbspfont-weight:bold;&nbspfont-family:courier;$x"<br>done<./if-5.bash </span><br></spanbr># Save your editing session and exit the text editor (eg. with vi: press When prompted, enter a '''ESCletter''', then type <u>instead</u> of a ''':wx''' followed by '''ENTER'number'').What happens?<br><br># Issue Let's edit the following linux command to add execute permissions '''for your -5.bash''' shell script:to perform '''error-checking''' to <bru>force<span style="color:blue;font-weight:bold;font-family:courier;">chmod /u+x for-5.bash</span><the user to enter a numeric value between '''0''' and '''100'''.<br><br># Run your shell script by issuing'''NOTE: <span style="color:blue;font-weight:bold;font-family:courier;">./for-5.bash</span><br><br>What do you notice? Does the output for this shell script differ than '''The '''while''' statement can be used with the '''test''' command (or a simple linux command or a linux pipeline command) for-4error checking.bash'''? Why?<br><br>The last thing in this section In our case, we will use a pipeline command with extended regular expressions. In order to loop while the result is to introduce TRUE (not FALSE), you can use the negation symbol (!) to '''error-checking'''set the test condition to the opposite.<br><br># Use the '''more''' command a text editor like vi or nano to view edit the text file called '''for./if-5.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">more forvi ./if-5.bash</span>)<br><br>Take a few moments to re-familiarize yourself with this # Add the following lines in your shell script<bru>IMMEDIATELY AFTER<br/u># Run your shell script by issuingthe read statement to prompt the user for a mark: <br><span style="colorfont-family:bluecourier;font-weight:bold;font-family:courier;">./for-5.bash <while ! echo $mark | egrep "^[0-9]{1,}$" > /dev/spannull 2>/dev/null<br>do<br>When prompted, enter a letter instead of &nbsp;&nbsp;&nbsp;read -p "Not a valid number. What happens?Enter a mark (0-100): " mark<br>done<br/span>Let's edit <br><br># Save your editing session and exit the text editor (eg. with vi: press '''for-5.bashESC''' shell script to perform , then type ''':x''' followed by '''error-checkingENTER''' to ).<ubr>force</ubr> the user to enter a numeric value between 0 and 100.# Run your shell script by issuing:<br><br>'''NOTEspan style="color:blue;font-weight:bold;font-family:courier;">./if-5.bash</span><br><br># When prompted, enter a ''' The '''while'letter''' statement can be used with the <u>instead</u> of a ''number''test. What happens?<br>Does the shell script allow you to enter an invalid grade like '''200''' command (or a simple linux command or a linux pipeline command) for error checking. In our case, we will use a pipeline command with extended regular expressions. In order '''-6'''?<br><br>Let's add an '''additional error-checking loop''' to loop while force the result is TRUE (not FALSE), you can use the negation symbol (!) user to set the test condition to the opposite.<br><br># Use enter a text editor like vi or nano to edit the text file called number between '''0''' and '''for-5.bash100''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;"br><br>vi for-5.bash</span>)Compound operators like '''&&''' and '''||''' can be used with the '''test''' command.<br><br>If you are using Let's use the nano text editor, refer '''||''' compound criteria to to notes on text editing in a previous week in NOT accept numbers '''outside''' of the course schedule.<br><range '''0''' to '''100'''.<br><br># Add Use a text editor like vi or nano to edit the following lines in your shell script <u>AFTER<text file called '''./u> the read statement to prompt the user for a mark:<br>if-5.bash''' (eg. <span style="font-familycolor:courierblue;font-weight:bold;font-family:courier;">vi ./if-5.bash</span>)<br>while ! echo $mark | egrep "^[0-9]{1,}$" <br># Add the following lines in your shell script <u> IMMEDIATELY AFTER</dev/null 2u> /dev/nullthe PREVIOUSLY ADDED<br>doerror-checking '''while''' loop statement to '''force''' the user to enter a valid number (between 1 and 100):<br> &nbsp<span style="font-family:courier;&nbsp;&nbspfont-weight:bold;read -p "Not a valid number. Enter a >while [ $mark (0-lt 0 ] || [ $mark -gt 100): " mark]<br>done</span>do<br><br># Save your editing session and exit the text editor &nbsp;&nbsp;&nbsp;read -p "Invalid number range. Enter a mark (eg. with vi0-100): press '''" mark<br>done</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br># Run your shell script by issuing:<br><span style="color:blue;font-weight:bold;font-family:courier;">./forif-5.bash</span><br><br># When prompted, enter a letter '''letter''' <u>instead </u> of a ''number''. What happens?<br>Does the shell script allow you to enter an '''invalid grade ''' like '''200 ''' or '''-6'''?<br><br>Let's add an additional error-checking loop to force the user to enter reinforce '''math operations''' in a number between 0 shell script (that you created in '''tutorial 10''') and 100then incorporate math operations within a loop.<br><br># Use a text editor like vi or nano to edit create the text file called '''for-56.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi for-56.bash</span>)<br><br># Add Enter the following lines in your shell script <u>AFTER</u> the PREVIOUSLY ADDED error-checking code block to force the user to enter a valid number:<br><span style="font-familyweight:courierbold;font-weightfamily:boldcourier;"><br>#!/bin/bash<br>value=1<br>while [ $mark value -lt 0 ] || [ $mark -gt 100 le 5 ]<br>do<br> &nbsp;&nbsp;echo "$value"<br>&nbsp;&nbsp;read -p "Invalid number range. Enter a mark (0-100): " markvalue=value+1<br>done<br></span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br># Run Set execute permissions for this shell script and run your shell script by issuing:<br><span style="color:blue;font-weight:bold;font-family:courier;">./for-56.bash</span><br><br>'''You should have noticed an error message'''.<br><br># When promptedTo demonstrate what went wrong, enter a letter instead of a number. What happens?<bru>issue</u>Does the shell script allow you to enter an invalid grade like following '''200commands''' or '''-6'''?<:<br><br># Use a text editor like vi or nano to create the text file called '''for-6.bash''' (eg. <span style="color:blue;font-weight:bold<span style="color:blue;font-weight:bold;font-family:courier;">vi for-6.bashnum1=5;num2=10</spanbr>)result=$num1+$num2<br>echo $result<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/span># Enter Notice that the user-defined variable stores the following lines in your shell script:text "'''10+5'''" which is <bru>NOT<span style="font-family:courier;font-weight:bold;">#!/bin/bash/u> the expected result of adding the number '''10''' and '''5'''.<br>clear<br>set As you may recall in '''tutorial 10 9 8 7 6 5 4 3 2 1<br>for x''', we need to convert a number stored as text into a '''binary number'''<br>dofor calculations (in this case, advance the value by 1 for each loop).<br>&nbsp;&nbsp;&nbsp;echo $xWe can accomplish this by using the math construct '''(( ))'''<br>done<br>echo "blast-off!"# To demonstrate, </spanu>issue<br/u><br># Save your editing session and exit the text editor (eg. with vi: press the following set of '''ESC''', then type commands''':wx''' followed by '''ENTER''').<br><br># Issue the following linux command to add execute permissions for your shell script:<br<br><br><span style="color:blue;font-weight:bold;font-family:courier;">chmod unum1=5;num2=10<br>sum=$(($num1+x for-6.bash$num2))</spanbr>echo $sum<br><br># Run your shell script by issuing: ((product=$num1*$num2))<br>echo $product</span style="color:blue;font-weight:bold;font-family:courier;">./<br><br>Let's correct our '''for-6.bash''' shell script to correctly use math operations.</spanbr><br><br>What do you notice?  # Use a text editor like vi or nano to edit the text file called '''for-6.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi for-6.bash</span>)<br><br># Edit '''line 6''' and replace with the following:<br><span style="font-family:courier;font-weight:bold;">((value=value+1))</span><br><br>'''Note:''' For those familiar with other programming languages, you can achieve the same results by using: '''((value++))'''<br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':x''' followed by '''ENTER''').<br><br># '''Run''' this Bash shell script again.<br><br>What do you notice this time? <br><br># Issue the following to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">~uli101/week12-check-2</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 use the '''exit''' statement to '''terminate the execution of a shell script'''<br>if not run with the properly number of arguments and use the '''break''' statement that will '''terminate a loop'''<br>but NOT terminate the running of the shell script. =INVESTIGATION 3: <span style="font-family:courier;font-weight:bold;">exit</span> AND <span style="font-family:courier;font-weight:bold;">break</span> STATEMENTS=  <br>In this investigation, you will learn to use the '''exit''' and '''break''' statements in your shell scripts.  '''THE EXIT STATEMENT''' The '''exit''' statement is used to terminate a shell script.<br>This statement is very useful when combined with logic in a shell script to display an '''error message'''<br>if the command was '''improperly executed''' and '''terminate''' the running of the shell script.<br><br>The ''exit'' command can contain return a ''value'' to provide the '''exit status'''<br>of your shell script (i.e. TRUE or FALSE value).<br><br> '''Perform the Following Steps:In the next investigation, you will learn to create and test-out the '''~/.bashrc''' start-up file to customize your Bash shell.
# Make certain that you are logged into matrix account.<br><br># Confirm that you are currently located in the '''advanced''' directory.<br><br># Use a text editor like vi or nano to create the text file called '''exit.bash''' (eg. <span style=INVESTIGATION 3"color: USING STARTblue;font-UP FILES weight:bold;font-family:courier;">vi exit.bash</span>)<br><br># Enter the following lines in the '''exit.bash''' shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br><br>if [ $# -ne 1 ]<br>then<br> &nbsp; echo "USAGE: $0 [arg]" &gt;&amp;2<br> &nbsp; exit 1<br>fi<br><br>echo "The argument is: $1"</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':x''' followed by '''ENTER''').<br><br># '''Add execute permissions''' for this Bash shell script.<br><br># Issue the following command (without arguments):<br><span style="color:blue;font-weight:bold;font-family:courier;">./exit.bash</span><br><br>What did you notice?<br><br>Since there are no arguments, the test within the running shell script returns FALSE,<br>then an '''error message''' with feedback of how to properly issue the shell script with an argument<br>and then '''terminates''' the Bash shell script.<br><br>Notice that the '''$0''' positional parameter displays the '''name''' of the currently running shell script<br>in the USAGE message. This is useful in case you decide to '''change''' the ''name'' of the shell script at a later time.<br><br>The symbol '''&gt;&amp;2''' redirects '''standard output''' from the USAGE message<br>to '''standard error''' making like a <u>real</u> error message.<br>This "''neat redirection trick''" will NOT be considered for evaluation for this coverage.<br><br># Issue the following Linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>What does this '''exit status''' from the previously issued command indicate?<br><br># Issue the following command (with an argument):<br><span style="color:blue;font-weight:bold;font-family:courier;">./exit.bash uli101</span><br><br>What did you notice this time?<br><br># Issue the following Linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>What does this '''exit status''' from the previously issued command indicate?<br><br># Issue the following command (with two arguments and redirecting stderr to a file):<br><span style="color:blue;font-weight:bold;font-family:courier;">./exit.bash uli101 Linux 2&gt; error.txt</span><br><br>What did you notice this time?<br><br># Issue the following Linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br># Issue the following Linux command to confirm that stderr was redirected to a file:<br><span style="color:blue;font-weight:bold;font-family:courier;">cat error.txt</span><br><br>
In this section, you will learn how to '''customize''' your '''Bash Linux shell environment''' by creating and testing a start-up file.
'''THE BREAK STATEMENT'''
The '''break''' statement is used to '''terminate''' a '''loop''' <u>without</u><br>
terminating the running shell script.
<br><br>
'''Perform the Following Steps:'''
# Use Make certain that you are logged into matrix account.<br><br># Confirm that you are currently located in the '''moreadvanced''' command directory.<br><br># Use a text editor like vi or nano to view create the contents of the start-up text file called '''/etc/profilebreak-1.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">more /etc/profilevi break-1.bash</span>)<br><br>This file contains # Enter the following lines in the '''default settingsbreak-1.bash''' when you open your Bourne shell (eg. if issuing the command '''sh''').script:<br><br># Use the '''more''' command to view the contents of the start-up file called '''/etc/bashrc''' (eg. <span style="colorfont-family:bluecourier;font-weight:bold;font">#!/bin/bash<br><br>read -familyp "Enter an integer:courier" number<br><br>while ! echo $number | egrep "^[0-9]{1,}$" > /dev/null 2> /dev/null || [ $number -ne 5 ] 2> /dev/null<br>do<br> &nbsp;"if [ $number -eq 5 ] 2>more /etcdev/bashrcnull<br> &nbsp; then<br> &nbsp; &nbsp; &nbsp;break<br> &nbsp; fi<br> &nbsp; read -p "Try again. Enter a valid integer: " number<br>done<br><br>echo "The number is: $number"</span>)<br><br>This file contains # Save your editing session and exit the text editor (eg. with vi: press '''default settingsESC''' when you , then type '''open your Bash shell:x''' (eg. if issuing the command followed by '''bashENTER''').<br><br>Since we are using the Bash shell by default, let# 's create a customized Bash start-up file.<br>This startup file is located in your '''home''' directory using the name "Add execute permissions'''for this Bash shell script.bashrc'''"<br><br># Let's move your .bashrc file to prevent accidental overwrite. Issue the following linux command(without arguments):<br><span style="color:blue;font-weight:bold;font-family:courier;">mv ~/.bashrc ~/break-1.bashrc.bkbash</span><br><br>If you experience an error message "When prompted, enter several '''invalid''' and '''valid''' integers. Then enter '''valid integers''' NOT containing the value of '''5'No such file or directory''".<br>Finally, just ignore since there is no startup file to backupenter the integer with the value of '''5'''.<br><br>What happens?<br><br>Let's use the '''break''' statement with the '''for''' loop.<br><br># Use a text editor like vi or nano to create the text file called '''~/break-2.bashrcbash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi ~/break-2.bashrcbash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your the '''break-2.bash''' shell script (the symbol ":<br><span style="font-family:courier;font-weight:bold;">[#!/bin/bash<br><br>for x</spanbr>" is the open square bracket symbol):do<br><span stylebr> &nbsp; if [ $x ="font-family:courieruli101" ]<br> &nbsp; then<br> &nbsp; &nbsp;font-weight:bold&nbsp;">clearbreak<br>echo -e -n "\e[0&nbsp;34m"fi<br>&nbsp; echo "Last Time Logged in (for security)Argument is:$x"<br>echodone<br>lastlog -u $USER<br>echo<br>echo -e -n "\e[mShell script has been completed"</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wxx''' followed by '''ENTER''').<br><br># You can test run the startup file without exiting and re-entering your '''Add execute permissions''' for this Bash shell environmentscript.<br><br># Issue the followingcommand (with arguments):<br><span style="color:blue;font-weight:bold;font-family:courier;">. ~/break-2.bashrcbash hwd101 ipc144 uli101 apc100</span><br><br>What do you notice?<br><br># Exit your current Bash shell session.<br><br># How come '''uli101''' and '''Loginapc100''' again to your matrix account.are NOT displayed<br><br>Did you start-up file customize your Bash shell environment with coloursbut a message appeared at the end of the script that the script completed?<br><br># Issue the following linux command to restore your previous settings for your bashrc startup filerun a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">mv ~uli101/.bashrc.bk ~/.bashrcweek12-check-3</span><br><br># If you experience an error message "encounter errors, make corrections and '''re-run'No such file or directory''", just ignore.the checking script until you<br><br># After you complete the Review Questions sections to get additional practicereceive a congratulations message, then work on your '''online assignment 3,'''you can proceed.<br>'''sections 4 to 6''' labelled: '''More Scripting (add)''', '''Yet More Scripting (oldfiles)''', and '''sed And awk'''<br><br>
: In the next investigation, we will learn to create / modify '''startup files'''<br>to <u>customize</u> your Linux shell environment.<br><br> = WHERE DO I GO FROM HERE? INVESTIGATION 4: USING START-UP FILES =<br>In this investigation, you will learn how to '''customize''' your '''Bash Linux shell environment'''<br>by creating and testing a '''start-up''' file.   '''Perform the Following Steps:'''
I hope # Issue a Linux command to change to your '''home''' directory.<br><br># Issue a Linux command to <u>confirm</u> you are located in the '''home''' directory.<br><br># Use the '''more''' command to view the contents of the '''default start-up''' file called '''/etc/profile''' <br><br>This file contains the '''default settings''' when you open your Bourne shell (eg. if issuing the command '''sh''').<br><br># Use the '''more''' command to view the contents of the start-up file called '''/etc/bashrc'''<br><br>This file contains the '''default settings''' when you '''open your Bash shell''' (eg. if issuing the command '''bash''').<br><br>Since we are using the '''Bash shell''' by default, let's create a '''customized Bash start-up file'''.<br>This startup file is located in your '''home''' directory using the name "'''.bash_profile'''"<br><br>Let's move your <span style="font-weight:bold;font-family:courier;">.bash_profile</span> file to prevent '''accidental overwrite'''.<br><br># Issue the following linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">mv ~/.bash_profile ~/.bash_profile.bk</span><br><br>If you experience an error message "''No such file or directory''",<br>just ignore this series of tutorials have been helpful command since there is no '''~/.bash_profile''' file in your home directory.<br><br># Use a text editor like vi or nano to create the text file called '''~/.bash_profile''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi ~/.bash_profile</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your shell script (the symbol "<span style="font-family:courier;font-weight:bold;">[</span>" is the open square bracket symbol):<br><span style="font-family:courier;font-weight:bold;">clear<br>echo -e -n "\e[0;34m"<br>echo "Last Time Logged in teaching (for security):"<br>echo<br>lastlog -u $USER<br>echo<br>echo -e -n "\e[m"</span><br><br>'''NOTE:''' You will notice there is '''NO she-bang line''' since this is a '''start-up''' file.<br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':x''' followed by '''ENTER''').<br><br># You can test run the startup file without exiting and re-entering your Bash shell environment.<br>Issue the following:<br><span style="color:blue;font-weight:bold;font-family:courier;">. ~/.bash_profile</span><br><br>What do you basic notice?<br><br># '''Exit''' your current Bash shell session.<br><br># '''Login''' again to your matrix account.<br><br>Did you start-up file customize your Bash shell environment with colours?<br><br>'''NOTE:''' This is where you can make your Linux OS skillsshell environment values '''persistent'''<br>(i.e. saved regardless of exit and login to your Bash Shell such as '''aliases''', '''umask''', etc.).<br><br># Issue the following linux command to '''restore''' your previous settings for your bashrc startup file:<br><span style="color:blue;font-weight:bold;font-family:courier;">mv ~/.bash_profile.bk ~/.bash_profile</span><br><br>If you experience an error message "''No such file or directory''", just ignore.<br><br># '''Exit''' your current Bash shell session.<br><br># '''Login''' again to your matrix account.<br><br>What did you notice this time?<br><br>
In order to get efficient in working in the Linux environment requires '''practice''' and '''applying''' what you have learned to administering Linux operating systems including '''users''', '''applications''', '''network services''' and '''network security'''.= FURTHER STUDY =
I hope this series of tutorials have been helpful in teaching you basic Linux OS skills.<br><br>In order to get efficient in working in the Linux environment requires '''practice''' and '''applying'''<br>what you have learned to perform Linux operating system administration including:<br>'''user management''', '''installing and removing applications''', '''network services''' and '''network security'''.<br><br>Although you are '''NOT''' required to perform '''Linux administration''' for this course, <br>there are useful '''course notes ''' and '''tutorialsTUTORIALS''' for advanced Linux server administration <br>that have been created for the Networking / Computer Support Specialist stream:
:* [https://wiki.cdot.senecacollege.ca/wiki/OPS235 OPS235OPS245 OPS245: Basic Linux Server Administration]
:* [https://wiki.cdot.senecacollege.ca/wiki/OPS335 OPS335: Advanced Linux Server Administration]
Take care and good luck in your future endeavours,&nbsp; <span style="font-family:courier;font-weight:bold;">:)</span>
<span style="font-size:1.3em; font-family:cursive">Murray Saul</span>
simulate a quiz:
https://ictwiki.cdot.senecacollege.ca/~murray.saululi101/uli101files/uli101_week12_practice.docx
Your instructor may take-up these questions during class. It is up to the student to attend classes in order to obtain the answers to the following questions. Your instructor will NOT provide these answers in any other form (eg. e-mail, etc).
'''Review Questions:'''
# Create Write code for a Bash shell script called '''retire.bash''' that when run, clears the screen, and then prompts the user for their age. If the age entered is less than 65, then display a message that the person is NOT eligible to retire. If the age is equal to 65, then display a message that the person just turned 65 and can retire. If the age is greater than 65, then display the message that the user is over 65 and why have they not have already retired already?<br><br># Add code to the '''retire.bash''' script created in the <u>previous </u> question to force the user to enter only an '''integer''' to provide error-checking for this shell script.<br><br>#Write code for a Bash shell script that will prompt the user for a '''valid POSTAL CODE'''.<br>A valid postal code consists of the following format: '''x#x #x#'''<br>where '''x''' represents an upper or lowercase letter<br>and '''#''' represents a number from 0-9<br><br>Also VALID postal codes can consist of no spaces or one or more spaces in the format shown above.<br><br>If the user enters an '''INVALID postal code''', indicate an error and allow the user to enter the VALID postal code. When the user enters a VALID postal code, then clear the screen and display the VALID postal code.<br><br># Write code that works similar to the previous question, but have it read an input file called '''unchecked-postalcodes.txt''' and only save VALID postal codes to a file called:<br>'''valid-postalcodes.txt'''<br><br>Design your Bash Shell script to only run if the user enters TWO ARGUMENTS:<br>'''unchecked-postalcodes.txt''' and '''valid-postalcodes.txt'''<br><br>Otherwise, display an error message and immediately exit your Bash Shell script with a false exit value.<br><br>
# What is the purpose of the '''/etc/profile''' startup file?<br><br>
# What is the purpose of the '''/etc/bashrc''' startup file?<br><br>
# What is the purpose of the '''~/.bashrc''' startup file?<br><br>
# What is the purpose of the '''~/.bash_profile''' file?<br><br>
# What is the purpose of the '''~/.bash_logout''' file?<br><br>
# Write <u>code</u> for the '''~/.bashrcbash_profile''' file below to clear the screen, welcome the user by their username, and display a list of all users currently logged into your Matrix server. Insert blank lines between each of those elements.<br><br># Write a command to <u>run</u> the recently created '''~/.bashrcbash_profile''' startup file from the previous question without exiting and re-logging into your Matrix account.<br><br>   _________________________________________________________________________________ Author: Murray Saul License: LGPL version 3Link: https://www.gnu.org/licenses/lgpl.html _________________________________________________________________________________ 
[[Category:ULI101]]