13,420
edits
Changes
no edit summary
=INTRODUCTION TO SHELL SCRIPTINGUSING SED & AWK UTILTIES=
<br>
===Main Objectives of this Practice Tutorial===
:* Plan and create Use the '''sed''' command to '''manipulate text''' contained in a Shell Scriptfile.
:* Explain the purpose of List and explain several '''addresses''' and '''instructions''' associated with the '''she-bang linesed''' contained at the top of a shell scriptcommand.
:* Set Use the '''permissionssed''' and command as a '''executefilter''' shell scriptswith Linux pipeline commands.
:* Use the '''environmentawk''' and command to '''user-definedmanipulate text''' variables contained in shell scriptsa file.
:* Use List and explain '''comparison operators''Command Substitution', '''variables''' and '''Math Operationsactions''' associated with the '''awk''' in shell scriptscommand.
:* Explain the purpose of the '''$?''' exit status and Use the '''testawk''' command. :* Use '''if''' and '''if-else''' logic statements in shell scripts. :* Use as a '''forfilter''' loop statement with a list in shell scriptsLinux pipeline commands.
<br><br>
|- valign="top" style="padding-left:15px;"
|colspan="2" |Course Notes'''Slides''':<ul><li>Week 11 Lecture 1 Notes:<br> [[Media:ULI101-Week11.1.pdf | PDF]] | [https://ictmatrix.senecacollege.ca/~murraychris.sauljohnson/uli101ULI101/ULI101-Week11.1.pptx PPTX]</li><li>Week 11 Lecture 2 Notes:<br> [[Media:ULI101-Week10Week11.2.pdf | PDF]] | [https://ictmatrix.senecacollege.ca/~murrayjason.saulcarman/uli101slides/ULI101-Week10Week11.2.pptx PPTX]<br></li></ul>
| style="padding-left:15px;" |Shell Scripting'''Text Manipulation:'''* [https://searchdatacenterwww.techtargetdigitalocean.com/definitioncommunity/shelltutorials/the-basics-of-using-the-sed-stream-editor-to-manipulate-text-in-linux Purpose of using the sed utility]* [https://www.digitalocean.com/community/tutorials/how-to-use-the-awk-language-to-manipulate-text-in-script linux Purposeof using the awk utility]
|colspan="1" style="padding-left:15px;" width="30%"|'''Brauer Instructional Videos:'''<ul><li>[https://www.youtube.com/watch?v=kxEP-KUhOSgnpU6S61AIko&list=PLU1b1f-2Oe90TuYfifnWulINjMv_Wr16N&index=5 Bash Shell Scripting - Part 114 Using the sed Utility]</li><li>[https://www.youtube.com/watch?v=cQepf9fY6cE Creating and Running a Shell ScriptOV3XzjDYgJo&list=PLU1b1f-2Oe90TuYfifnWulINjMv_Wr16N&index=13 Using the awk Utility]</li></ul>
|}
= KEY CONCEPTS =
''Examples:''<br><span style="color:blue;font-weight:bold;font-family:courier;">Syntax: sed [-n] 'address instruction''chmod u+x myscript.bash<br>./myscript.bash<br>/home/username/myscript.bash<br>~/myscript.bashfilename</span>'''<br><br>
'''How it Works:'''
<br>
'''Command SubstitutionAddress:'''
<br><br>
<br>
<br>
* Action to be executed is contained within braces ''Example'{}'''* The '''print''' command can be used to display text (fields).* You can use parameters which represent fields within records (lines) within the expression of the awk utility.* The parameter '''$0''' represents all of the fields contained in the record (line).* The parameters '''$1''', '''$2''', '''$3''' … '''$9''' represent the first, second and third to the 9th fields contained within the record. * Parameters greater than nine requires the value of the parameter to be placed within braces (for example: '''${10}''','''${11}''','''${12}''', etc.)* You can use built-in '''variables''' (such as '''NR''' or "record number" representing line number)<br>eg. '''{print NR,$0}''' (will print record number, then entire record).
<span style="color:red;">'''ATTENTION''': Effective '''May 9, 2022''' - this online tutorial will be required to be completed by '''Friday in week 11 by midnight'''<br>to obtain a grade of '''2%''' towards this course</span><br><br>
'''Perform the Following Steps:'''
# '''Login''' to your matrix accountand confirm you are located in your '''home''' directory.<br><br># Issue a Linux command to create a directory called '''confirmsed''' you are located in your '''home''' directory.<br><br>We want # Issue a Linux command to create a Bash Shell script <u>change</u> to welcome the user by their ''username'sed''' directory and confirm that you are located in the '''sed''.<br>Let's first look at selecting an appropriate filename for your shell scriptdirectory.<br><br># Issue the following linux Linux command to check if download the filename called data.txt file<br>('''hellocopy and paste'''<br>already exists as a commandto save time):<br><span style="color:blue;font-weight:bold;font-family:courier;">which hellowget <nowiki>https://ict.senecacollege.ca/~murray.saul/uli101/data.txt</nowiki></span><br><br>The output from this # Issue the '''more''' command should indicate that to quickly view the contents of the shell did NOT'''data.txt''' file.<br>find any directories that contained this filename that could representWhen finished, exit the more command by pressing the letter <br>a commandspan style="color:blue;font-weight:bold;font-family:courier; therefore, this shell script name CAN be used.<br">q<br/span>[[Image:hello0sed-1.png|thumb|right|200px300px|Using a Issuing the '''text editorp''' to add Linux commands in to instruction without using the '''hello-n''' shell scriptoption (to suppress original output) will display lines twice.]]# Use a <br><br>The '''text editorp''' like instruction with the '''vised''' or command is used to<br>'''nanoprint''' to create the text file called (i.e. '''hello'display'') the contents of a text file.<br><br># Enter Issue the following two lines in your shell scriptLinux command:<br><span style="color:blue;font-familyweight:courierbold;font-weightfamily:boldcourier;">echo<br>echo "Hello $USER"<br>echosed 'p' data.txt</span><br><br>'''NOTE:You should notice that each line appears twice''' .<br><br>The variable called reason why standard output appears twice is that the sed command<br>(without the '''USER-n option''' is ) displays all lines regardless of an address used.<br><br>We will use '''environment variablepipeline commands''' that contains to both display stdout to the screen and save to files<br>for <u>currentconfirmation</u> userof running these pipeline commands when run a '''s login namechecking-script''' later in this investigation. If you wanted to share your shell script with other users, when they run <br><br># Issue the shell script, they will greeted by following Linux pipeline command:<br><uspan style="color:blue;font-weight:bold;font-family:courier;">theirsed -n 'p' data.txt | tee sed-1.txt</uspan><br><br> usernameWhat do you notice? You should see only one line. <br><br>You can specify an '''address'Environment variables'' make your shell script adaptable by ALL users.to display lines using the sed utility<br><br>(eg. ''line # '', '''Saveline #s''' your editing session and or range of '''exitline #s''' the text editor).<br><br>Instead of issuing # Issue the '''bash''' following Linux pipeline command followed by your shell script pathname as an ''argument'',:<br>let<span style="color:blue;font-weight:bold;font-family:courier;">sed -n 's simply run it by its filename1 p' data. This is the most common method of running shell scriptstxt | tee sed-2.txt</span><br><br>You should see the first line of the text file displayed.<table align="right"br>What other command is used to only display the first line in a file?<tr valign="top"br><tdbr>[[Image:nosed-execute2.png|thumb|right|230px500px|An Using the sed command to display a '''error messagerange''' of lines.]]# Issue the following Linux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">sed -n '2,5 p' data.txt | tee sed-3.txt</span><br><br>What is displayed? How would you modify the sed command to display the line range 10 to 50?<br><br>The '''s''' will appear when trying instruction is used to run '''substitute''' text<br>(a shell script by name that does NOT have similar to method was demonstrated in the vi editor in tutorial 9).<br><br># Issue the following Linux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">sed '2,5 s/TUTORIAL/LESSON/g' data.txt | tee sed-4.txt | more</span><br><br>What do you notice? View the original contents of lines 2 to 5 in the '''executedata.txt''' permissionsfile<br>in another shell to confirm that the substitution occurred.]]</tdbr><tdbr>[[Image:hello1sed-3.png|thumb|right|150px500px|Output from running your Using the sed command with the '''hello-q''' shell script (YourUserID representing <u>your</u> username)option to display up to a line number, then quit.]]The '''q''' instruction terminates or '''quits''' the execution of the sed utility as soon as it is read in a particular line or matching pattern.</tdbr></tablebr># Issue the following linux Linux pipeline command to run your shell script in your current directory:<br><span style="color:blue;font-weight:bold;font-family:courier;">sed '11 q' data.txt | tee sed-5./hellotxt</span><br><br>What did you notice? How many lines were displayed<br>before the sed command exited?<br><br>You should notice an can use '''ERROR messageregular expressions''' indicating you don't have permissions to run select lines that match a pattern. In fact,<br>the sed command was one of the file<u>first</u> Linux commands that used regular expression. To fix this, you need to<br><br>The rules remain the same for using regular expressions as demonstrated in '''add execute permissionstutorial 9''' prior to running <br>except the shell scriptregular expression must be contained within '''forward slashes'''<br>(eg. <span style="font-family:courier;font-weight:bold;">/regexp/</span> ).<br><br># Issue [[Image:sed-4.png|thumb|right|400px|Using the following linux sed command to using regular expressions with '''addanchors'''<br>execute permissions for your shell script.]]# Issue the following Linux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">chmod u+x hellosed -n '/^The/ p' data.txt | tee sed-6.txt</span><br><br>What do you notice?<br><br># Issue the following to run your shell scriptLinux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">sed -n '/d$/ p' data./hellotxt | tee sed-7.txt</span><br><br>Did your shell script runWhat do you notice?<br><br><span style="color:red;">The '''ATTENTION:sed''' Students might get FRUSTRATED when performing their utility can also be used as a '''assignment 3filter''' when their Bash shell scripts have errorsto manipulate text that<br>was generated from Linux commands.<br><br>[[Image:sed-5. One major cause is png|thumb|right|400px|Using the the OUTPUT of their Bash shell script when run does not sed command with '''EXACTLY matchpipeline''' commands.]]# Issue the required output for the correct Bash shell scriptfollowing Linux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">who | sed -n '/^[a-m]/ p' | tee sed-8. This requires that txt | more</span><br><br>What did you CAREFULLY notice?<br><br># Issue the following Linux pipeline command:<br><span style="color:blue;font-weight:bold;font-family:courier;">ls | sed -n '/txt$/ p''read''' the requirements of your Bash shell script and create it to the EXACT specifications| tee sed-9.txt</span><br><br>What did you notice?<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~uli101/myscripts/week10week11-check-1</span><br><br># If you encounter errors, make corrections and '''re-run''' the checking script until you<br>until you receive a congratulations message, then you can proceed.<br><br>::In the next investigation, you will learn to create and run shell scripts that<br >use '''variables''', '''positional''' and '''special parameters'''. You will also learn how to<br><u>add</u> a '''she-bang line''' at the top of a shell script to force it to run in a specified shell.<br><br>Proceed to the next investigation.<br><br>
=INVESTIGATION 2: USING THE AWK UTILITY =
In this investigation, you will learn how to use the awk utility to manipulate text and generate reports.
'''Perform the Following Steps:'''
# Confirm that Change to your '''home''' directory and issue a command to '''confirm'''<br>you are located in your '''home''' directory in your Matrix account.<br><br>Let's run shell scripts # Issue a Linux command to create a directory called '''awk'''<ubr>with</ubr> and # Issue a Linux command to <u>withoutchange</u> a to the '''she-bangawk''' line at directory and confirm you are located in the top of your shell script<br>to understand why a ''she-bang'awk''' line should be useddirectory.<br><br># Use Let's download a text editor to '''edit''' the '''hello''' shell script database file that you created in the <u>previous</u> investigationcontains information regarding classic cars.<br><br># Add Issue the following line to the <u>bottom</u> of the file (''linux command ('''copy''' and '''paste''' to prevent ''errors''save time):<br><span style="font-familycolor:courierblue;font-weight:bold;">echo "The current shell you are using isfont-family: $(ps -o cmd= -p $$|cut -d' ' -f1)courier;"</span><br>wget <brnowiki>'''FYIhttps:''' This command displays //ict.senecacollege.ca/~murray.saul/uli101/cars.txt</nowiki></span><br><br># Issue the '''namecat''' command to quickly view the contents of the ''shell'cars.txt' that the shell script is running in'' file.<br><br>The "'''print'''" action (command within ) is the <u>default<span style="font-family:courier;font-weight:bold;"/u>$( )action of awk to print</spanbr> uses all selected lines that match a technique known as '''command substitutionpattern'''.<br><br># Issue the following Linux command to change to the This '''action''' (contained in braces) can provide more options<br>such as printing '''Bourne Shellspecific fields''':of selected lines (or records) from a database.<br><span style="colorbr>[[Image:blue;fontawk-weight:bold;font-family:courier;">sh</span><br><br>You should notice your shell prompt changed that indicates that you are in a different shell1.png|thumb|right|400px|Using the awk command to display matches of the pattern '''ford'''.<br><br>[[Image:hello2]]# Issue the following linux command all to display all lines (i.e.png|thumb|right|275px|Changing records) in the Bourne shell and running shell script '''withoutcars.txt''' a '''She-bang'database that matches the pattern (or "make") called '' line.]]# Issue the following Linux command to run your shell script in the 'ford'Bourne Shell'':<br><span style="color:blue;font-weight:bold;font-family:courier;">.awk '/helloford/ {print}' cars.txt</span><br><br>You should see that you are currently running the shell script "We will use '''shpipeline commands'''"<br>which represents to both display stdout to the '''Bourne shell'''.screen and save to files for <bru>confirmation<br/u>of running these pipeline commands when run a '''NOTE:checking-script''' Due to the fact that shells (and their features) have '''evolved''' over a period of time,later in this investigation.<br>an error may occur if you include a <br># Issue the following linux pipeline command all to display records<br>in the '''NEWER shell featurecars.txt''' database that contain the pattern (i.e.g. ''Bash Shell''make) but run it in an '''OLDER shellford''' (For example: the ''Bourne Shell'').<<br><br>[[Imagespan style="color:sheblue;font-bangweight:bold;font-1.png|thumb|right|275px|Adding a family:courier;">awk '/ford/''shecars.txt | tee awk-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).]]1.txt</span><br><br>What do you notice? You can add a '''special commentshould notice ALL lines displayed <u>without</u> using ''' called a search criteria'''she-bang line''' at the BEGINNING of the .<ubr>FIRST line</ubr> of your shell script to You can use ''builtin''force''' it to run in variables''' with the shell you want (for example: the Bash shell).<br><br> # Edit your '''helloprint''' shell script using a text editorcommand for further processing.<br><brWe will discuss the following variables in this tutorial:<br># <br>[[Image:awk-2.png|thumb|right|400px|Using the awk command to print search results by '''Insertfield number''' the following line at the .]]'''beginning$0''' of the - Current record (entire line)<br>'''first$1''' line of your hello file:- First field in record<br>'''$n''' - nth field in record<span style="fontbr>'''NR''' -family:courier;font-weight:bold;">#!/bin/bashRecord Number (order in database)</spanbr><br><br>This is referred to as a '''she-bang lineNF'''. It forces this script to be run - Number of fields in the '''Bash Shell'''.current record<br>When your Bash Shell script finishes execution<br>For a listing of more variables, you are returned to please consult your current shell that you are using (which in our case in Matrix, is still the Bash shell)course notes.<br><br>[[Image:hello3.png|thumb|right|275px|Changing # Issue the following linux pipeline command to display the Bourne shell and running shell script '''withmodel''' a , '''She-bangyear''' line (forcing script to run in the , '''Bashquantity''' shell).]]# and price<br>in the '''Savecars.txt''' your editing changes and database for makes of '''exitchevy''' your text editor.<br><br># While in the Bourne shell, issue the following Linux command:<br><span style="color:blue;font-weight:bold;font-family:courier;">.awk '/hello<chevy/span><br{print $2,$3,$4,$5}' cars.txt | tee awk-2.txt</span><br><br>You should notice Notice that the shell name is running in the a '''Bash shellspace'''.<is the delimiter for the fields that appear as standard output.<br><br> # It is a good idea to rename your shell script to include an The '''extensiontilde character''' to<br>explain that this is '''Bash Shell script~''' file (referred is used to as search for a "''portable Bash shell script''")pattern or display standard output for a particular field. <br><br># Issue the following Linux linux pipeline command to rename your shell script file:display all '''plymouths''' ('''plym''')<br>by '''model name''', '''price''' and '''quantity''':<br><span style="color:blue;font-weight:bold;font-family:courier;">mv hello hello.bash<awk '$1 ~ /plym/span>{print $2,$3,$4,$5}' cars.txt | tee awk-3.txt<br/span><br># Confirm that the modification work by running your Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;"You can also use '''comparison operators''' to specify conditions for processing with matched patterns<br>when using the awk command./hello.bashSince they are used WITHIN the awk expression,</spanbr>they are not confused with redirection symbols<br><br># Enter [[Image:awk-3.png|thumb|right|400px|Using the following Linux awk command to display results based on '''exitcomparison operators''' the .]]''Bourne shell'<' and return to your ''Bash shell'': Less than<br>'''<span style="color:blue''' font-weight:bold font-family:courier;"Less than or equal<br>exit</span'''>''' Greater than<br><br>Let's use some ''>='ENVIRONMENT variables''' in our Bash Shell script. Greater than or equal<br>'''==''' Equal<br># Use a text editor to edit the shell script called '''hello.bash!=''' Not equal<br><br># Add Issue the following lines linux pipeline command to display display the <u>bottom</u> of the ''hello.bash'car make''', '''model''', '''quantity''' file:<br><span style="font-familyand '''price''' of all vehicles whose '''prices are less than $5,000''':<br><span style="color:courierblue;font-weight:bold;">echo<br>echo "The current directory location isfont-family: $PWDcourier;"<br>echo "The current user home directory is: awk '$HOME"5 <br>echo</span5000 {print $1,$2,$4,$5}' cars.txt | tee awk-4.txt</span><br><br># Save your editing changes and exit your text editor.What do you notice?<br><br>[[Image:hello4-0.png|thumb|right|330px|Running # Issue the following linux pipeline command to display display '''price''',<u>modified</ubr> ''hello.bash'quantity''', '''model''' and '''car make''' of vehicles whose '''prices are less than $5,000''' Bash shell script by using relative pathname: <br><span style="color:blue;font-weight:bold;font-family:courier;">awk '$5 < 5000 {print $5,$4,$2,$1}'cars./hellotxt | tee awk-5.bash''txt</span>]]<br><br># To confirm that you properly renamed your shell script,<br>run Issue the following shell script:linux pipeline command to display the '''car make''',<br><span style="color'''year''' and '''quantity''' of cars that '''begin''' with the '''letter 'f'''':blue;font<br><span style="color:blue;font-weight:bold;font-family:courier;">awk '$1 ~ /^f/ {print $1,$2,$4}' cars./hellotxt | tee awk-6.bashtxt</span><br><br>Take time to view the output and the values of the environment variables[[Image:awk-4.<br><br># Issue png|thumb|right|400px|Using the following Linux awk command to add your current directory to the display combined search results based on '''PATHcompound operators''' environment variable.]]Combined pattern searches can be made<br>by using '''compound operator''' symbols:<br><span style="color:bluebr>'''&&''' font-weight:bold font-family:courier;">PATH=$PATH:.</span>(and)<br>'''||''' (or)<br>[[Image:hello4.png|thumb|right|330px|Running <ubr>modified</ubr> # Issue the following linux pipeline command to list all ''hello.bash'fords''' Bash shell script by entering <u>just</ubr> whose '''filenameprice is greater than $10,000''' (i.e. :<br><span style="color:blue;font-weight:bold;font-family:courier;">awk ''hello.bash''<$1 ~ /ford/span> and NOT <span style="font-family:courier;"&& $5 >10000 {print $0}''cars./hellotxt | tee awk-7.bash''txt</span> shown in previous diagram).]]<br><br># Issue the following Linux linux command to confirm that the current directory ('''"."copy and paste''' has been added to the '''PATH''' environment variablesave time):<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $PATHwget <nowiki>https://ict.senecacollege.ca/~murray.saul/uli101/cars2.txt</nowiki></span><br><br># Issue the following '''cat''' command to run your Bash shell script just by name:quickly view the contents of the '''cars2.txt''' file.<br><span style="color:blue;font-weight:bold;font-family:courier;">hello.bash</spanbr># Issue the following linux pipeline command to display the '''year'''<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 '''quantity''' of cars that '''begin''' with the '''hello.bashletter 'f'''' shell script by just using the name.<br><br>What did you notice?<br><br>The setting of for the '''PATHcars2.txt''' environment variable only worked in the current session only.database:<br>If you exit the current Matrix session<span style="color:blue;font-weight:bold;font-family:courier;">awk '$1 ~ /^f/ {print $2, then the recently changed settings for environment variables will be lost$4}' cars2.txt | tee awk-8.<br>You will in a <u>futuretxt</uspan> tutorial how to set environment variables in '''start-up''' files.<br><br><span style="color:red;"What did you notice?<br><br>The problem is that the '''ATTENTION:cars2.txt''' Students will get FRUSTRATED when performing their database separates each field by a semi-colon ('''assignment 3;''' when their Bash shell scripts have errors. One major cause is that the OUTPUT of <) <u>yourinstead</u> Bash shell script does NOT match the of '''required outputTAB''' of .<br>Therefore, it does not recognize the assignment checking programsecond and fourth fields. This requires that you CAREFULLY '''read''' <br><br>You need to issue awk with the requirements of your Bash shell script -F option to match the EXACT specifications</span>indicate that this file's fields are separated (delimited) by a semi-colorn.<br><br># Issue the following Linux linux pipeline command to run a checking script:display the '''year'''<br><span style="color:blue;font-weightand '''quantity''' of cars that '''begin''' with the '''letter 'f'''' for the '''cars2.txt''' database:bold;font-family:courier;"<br>bash /home/murray.saul/myscripts/week10<span style="color:blue;font-checkweight:bold;font-2 | more</span><br><brfamily:courier;">If you encounter errorsawk -F";" '$1 ~ /^f/ {print $2, make corrections and $4}'''recars2.txt | tee awk-run''' the checking script until you9.txt</span><br><br>receive a congratulations message, then What did you can proceed.notice this time?<br><br>Let's create # Issue the following to run a Bash shell checking script that contain '''user-created variables'''.:<br><br># Use a text editor to create a Bash shell script called '''userspan style="color:blue;font-weight:bold;font-family:courier;">~uli101/week11-check-variables.bash'''2</span><br><br># Add the following lines to the beginning of the If you encounter errors, make corrections and '''userre-variables.bashrun''' file:the checking script until you<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>read -p "Enter your Full Name: " name<br>read -p "Enter your age (in years): " age<br>echo "Hello $name - You are $age years old"</span><br><br># Save your editing changes and exit your text editor.<br><br>[[Image:user-variable1.png|thumb|right|300px|Prompting user to enter data via the '''read -p''' command storing into '''user-created variable'''.]]# Issue the '''chmod''' command to add '''execute permissions''' for the user for the '''user-variables.bash''' file.<br><br># Issue the following to run the user-variables.bash Bash shell script<br> (enter your Full name and age when prompted):<br><span style="color:blue;font-weight:bold;font-family:courier;">./user-variables.bash</span><br><br>What did you notice?<br><br># Use a text editor to '''modify''' your Bash shell script called '''user-variables.bash'''<br><br># '''Insert''' the following lines immediately <u>'''below'''</u> the '''she-bang''' line:<br><span style="font-family:courier;font-weight:bold;">age=25<br>readonly age</span><br><br># Save your editing changes and exit your text editor.<br><br>[[Image:user-variable2.png|thumb|right|330px|Trying to change the value of a '''read-only''' variable'''.]]# Issue the following to run the user-variables.bash Bash shell script:<br><span style="color:blue;font-weight:bold;font-family:courier;">./user-variables.bash</span><br><br>What do you notice when you try to change the age variable? Why?<br><br>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 be<br>displayed properly since you did NOT provide any '''arguments''' when <u>running</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;">receive a congratulations message, then you can proceed./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'' have changed when using the '''shift''' command. <br>
= LINUX PRACTICE QUESTIONS =
https://ict.senecacollege.ca/~murray.saul/uli101/uli101_week11_practice.docx
''For example'Review Questions:'''
Note the contents from the following tab-delimited file called '''~murray.saul/uli101/stuff.txt''':
(this file pathname exists for checking your work)
'''Perform Part B: Writing Linux Commands Using the Following Steps:sed Utility'''
'''Perform the Following Steps:'''<br><br>: You can test conditions by issuing '''Linux commands / pipeline commands''' and by using the '''test''' command.<br><br># Confirm that you are located in your '''home''' directory in your Matrix account.<br><br># Issue the following Linux commands at the Bash shell prompt to assign values to several variables:<br><span style="color:blue;font-weight:bold;font-family:courier;">course="ULI101"<br>number1=5<br>number2=10</span><br><br># Issue the following Linux command to test a condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course = "ULI101"</span><br><br>The '''$?''' variable is used to store an '''exit status''' of the <u>previously-issued</u> command (including the test command).<br>If the exit status is '''zero''', then it indicates a TRUE value and if the status is '''non-zero''', then it indicates a FALSE value.<br><br># Issue the following Linux command to view the status of the previously-issued '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>Based on the ''exit status'' value, is the result TRUE or FALSE?<br><br># Issue the following Linux command to test another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course = "uli101"</span><br><br># Issue the following Linux command to view the status of the previously-issued '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">echo $?</span><br><br>Based on the ''exit status'' value, is the result TRUE or FALSE?<br>The value is non-zero (FALSE) since UPPERCASE characters<br>are different than lowercase characters.<br><br># Issue the following Linux command to test another condition:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $course != "uli101"</span><br><br># Issue a linux command to display the value of '''$?'''<br><br>What is the result? Why?<br><br># Issue the following Linux command to test a condition involving earlier assigned variables:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $number1 > $number2</span><br><br># Issue a Linux command to display the value of '''$?'''<br><br>'''NOTE:''' You will notice that something is '''wrong'''.<br>The exit status '''$?''' shows a zero (TRUE) value, but the number 5 is definitely NOT greater than 10.<br>The problem is that the symbols '''<''' and '''>''' are interpreted as REDIRECTION symbols!<br><br># To prove this, issue the following Linux command :<br><span style="color:blue;font-weight:bold;font-family:courier;">ls -l 10</span><br><br>You should notice a file called "'''10'''". The incorrectly issued '''test''' command used redirect to create an empty file instead,<br> 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 options:<br>'''-lt''' (<), '''-le''' (<=), '''-gt''' (>), '''-ge''' (>=;), '''-eq''' (=), '''-ne''' (!=)<br><br># Issue the correct Linux command to properly test both values:<br><span style="color:blue;font-weight:bold;font-family:courier;">test $number1 -gt $number2</span><br><br># Issue a Linux command to display the value of '''$?'''.<br><br>You should notice that the exit status value is now FALSE which is the correct result.<br><br># The '''test''' command can be abbreviated by the square brackets '''[ ]''' which contains the '''test''' condition<br>within the square brackets. You need to have spaces between the brackets and the test condition;<br>otherwise, you will get a test error.<br><br># To generate a '''test error''', copy and paste the following '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">[$number1 -gt $number2]</span><br><br>The reason for the error was that you need '''spaces''' between the '''square brackets''' and the '''test condition'''.<br><br># Copy and paste the following (correct) '''test''' command:<br><span style="color:blue;font-weight:bold;font-family:courier;">[ $number1 -gt $number2 ]</span><br><br># Issue a command to view the value of the '''exit status''' of the previously issued '''test''' command.<br>You should notice that is works properly.<br><br>Now that we have learned how to test conditions, let's learn about '''control-flow''' statements.<br><br>'''Logic statements''' are used to create '''different paths''' or directions that the shell script will take<br>based on the <u>result</u> of the '''test condition'''. In this tutorial,<br>we will only focus on the '''if''' and '''if-else''' logic statement.<br><br># Use a text editor like vi or nano to create the text file called '''if-1.bash''' (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 (eg. with vi: press '''ESC''', then type ''':wx''' 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: <span style="color:blue;font-weight:bold;font-family:courier;">./if-1.bash</span><br><br>Confirm that the output indicated a correct result.<br><br># Use a text editor like vi or nano to create the text file called '''if-2.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-2.bash</span>)<br><br>If you are using the nano text editor, refer to notes on text editing in a previous week in the course schedule.<br><br># Enter the following lines in your shell script:<br><span style="font-family:courier;font-weight:bold;">#!/bin/bash<br>read -p "Enter the first number: " num1<br>read -p "Enter the second number: " num2<br>if [ $num1 -gt $num2 ]<br>then<br> echo "The first number is greater than the second number."<br>fi</span><br><br># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wx''' followed by '''ENTER''').<br><br>[[ImagePart C:if-2.png|thumb|right|320px|Output of a shell script using the '''read''' command '''if''' control-flow statement.]]# Issue the following Writing 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: <span style="color:blue;font-weight:bold;font-family:courier;">./if-2.bash</span><br><br>Confirm that the output indicated a correct result.<br><br>What happens when you enter a first number that is less than or equal to the second number? Let's use an '''if-else''' statement to provide an appropriate alternative<br>if the condition is FALSE.<br><br># Use a text editor like vi or nano to create the text file called '''if-3.bash''' (eg. <span style="color:blue;font-weight:bold;font-family:courier;">vi if-3.bash</span>)<br><br># Enter Commands Using 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># Save your editing session and exit the text editor (eg. with vi: press '''ESC''', then type ''':wx''' followed by '''ENTER''').<br><br>[[Image:if-3.png|thumb|right|330px|Output of a shell script using the '''if-else''' control-flow statement.]]# Issue the following Linux 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.bash</span><br><br>What do you notice? Try running the script several times with numbers different and equal to each other to confirm that the shell script works correctly.<br><br>Let's learn how to use a '''loop''' with shell scripting. In this tutorial, we will only focus on one simple use with the '''for''' loop.<br><br># Use a text editor like vi or nano to create the text file called '''for-1.bash''' (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 (eg. with vi: press '''ESC''', then type ''':wx''' 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: <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''' (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 (eg. with vi: press '''ESC''', then type ''':wx''' followed by '''ENTER''').<br><br># Issue the following Linux command to add execute permissions for your shell 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: <span style="color:blue;font-weight:bold;font-family:courier;">./for-2.bash 10 9 8 7 6 5 4 3 2 1</span><br><br>How does this differ from the previous shell script?<br><br>You will learn in a couple of weeks more examples of using loop statements.<br><br>Let's run a '''checking-script''' to confirm that both your '''for-1.bash''' and '''for-2.bash'''<br>Bash shell scripts exist, have execute permissions, and when run, produce<br>the same OUTPUT as required in this tutorial's instructions.<br><br># Issue the following Linux command to run a checking script:<br><span style="color:blue;font-weight:bold;font-family:courier;">bash /home/murray.saul/myscripts/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># 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)awk Utility'''.<br><br>
<pre>
Line one.
This is the second line.
This is the third.
This is line four.
Five.
Line six follows
Followed by 7
Now line 8
and line nine
Finally, line 10
</pre>
'''Write the results of each of the following Linux commands for the above-mentioned file:'''
# Write a Linux awk command to display all records for the file:'''cat walkthru1~/cars''' whose fifth field is greater than 10000.bash<br><br># Write a Linux awk command to display the first and fourth fields for the file: '''~/cars''' whose fifth field begins with a number.<br><prebr>#!Write a Linux awk command to display the second and third fields for the file: '''~/usr/bin/bashcars''' for records that match the pattern “chevy”.<br><br>word1=”counter”word2=”clockwise”echo “The combined word is# Write a Linux awk command to display the first and second fields for all the records contained in the file: $word2$word1”'''~/cars'''<br></prebr>
[[Category:ULI101]]