Transcript Document
C151 Multi-User Operating Systems Scripts and Shell Programming Shell Script A file containing list of commands Usually it has the extension .sh. Each line (command) is interpreted and executed by a shell program (interpreter). We will discuss bash shell. -------------------------------------------------------Shell interpreter Shell script Steps to Run a Shell Script Create a file (say file_name.sh)using your favorite editor Make the file executable chmod 700 file_name.sh Run the script file_name.sh First Line The first line should look like this #!/bin/bash This line tells: Which shell (interpreter) should be used to execute the script: bash Where to find the shell (interpreter): /bin/bash Comments Comments: any line starting with a # will be considered as comments Exception: The very first one Example: #!/bin/bash #This is my first shell script pwd ls –l Combining Commands Several commands on the same line: separated with ; Example: cd .. ; make ; cd src Output Use echo command #!/bin/bash #This is my first shell script echo “This is my current working directory” pwd echo “These are the files in my current working directory” ls –l See This Script test.sh #!/bin/bash echo $0 echo $1 echo $2 echo $# echo $* See This Script test.sh #!/bin/bash echo $0 echo $1 echo $2 echo $# echo $* See this script test.sh #!/bin/bash echo $0 echo $1 echo $2 echo $# echo $* Command Line Parameters The command parameters are arguments that can be given in the command line when we run the script. $0 is the name of the script file. $1 is the first argument in the command line, $2 is the second, etc. $# is the number of arguments. $* contains all the arguments. Variables The name of a variable is a placeholder for its value, the data it holds. If v is the name of a variable, then $v is a reference to its value What result will be displayed for the following script? #!/bin/bash v=23 echo v echo $v Variables The name of a variable is a placeholder for its value, the data it holds. If v is the name of a variable, then $v is a reference to its value What result will be displayed for the following script? #!/bin/bash v=23 echo v echo $v v 23 Assignment operator = Rule: No space permitted on either side of = sign. Variable Rule Assign a value to name of a variable Read variable value through reference of the variable Example: Name of the variable: num Value of the variable $num num 23 Task 1 Create two variables: a, b Assign a with value 100 Assign b with value 200 Disply the values of a and b Reassign b with the value of a Display the values of a and b Script for Task 1 #!/bin/bash a=100 b=200 echo $a echo $b b=$a echo $a echo $b Script for Task 1 #!/bin/bash a=100 b=200 echo $a echo $b b=$a echo $a echo $b 100 200 100 100 Number Operations All computations in a shell script are done with integers. A number operation must be placed within the following syntax: $[expression] For example a=$[2+3] echo $a (5 will be displayed) Number Operations v1=100 echo $v1 v2=$v1/2 echo $v2 (100) (?) Number Operation v1=100 echo $v1 v2=$v1/2 echo $v2 (100) (100/2) Number Operation v1=100 echo $v1 v2=$[$v1/2] echo $v2 (100) (50) Arithmetic Operators + plus - minus * multiplication / division ** exponentiation % modulo Task 2 Create two variables a and b, and assign each with a value. Calculate value a plus value b and assign it to variable c Calculate value a minus value b and assign it to variable d Calculate value c multiply value d and assign it to variable e Calculate value e divided by 2 and assign it to variable f Display value of f Script for Task 2 #!/bin/bash a=5 b=3 c=$[$a+$b] d=$[$a-$b] e=$[$c*$d] f=$[$e/2] echo $f Script for Task 2 #!/bin/bash a=5 b=3 c=$[$a+$b] d=$[$a-$b] e=$[$c*$d] f=$[$e/2] echo $f 8 Input Use read command read variable_name Input Example #!/bin/bash echo “Enter your name:” read name echo “Enter your age:” read age echo “The age of $name is $age” Input Example #!/bin/bash echo “Enter your name:” read name echo “Enter your age:” read age echo “The age of $name is $age” Integer Comparison Test if two integer variables are equal or not if [ $a -eq $b ] -Note: must have a space before and after brackets and operators Integer Comparison -eq is equal to -ne is not equal to -gt is greater than -ge is greater than or equal to -lt is less than -le is less than or equal to If Statement if [ condition ] then command(s) else command(s) fi if [ condition ] then command(s) elif [ condition ] then command(s) else command(s) fi You can have more elif [] then statements Task 3 Ask user to enter two integer numbers and display which number is greater Script for Task 3 #!/bin/bash echo “Enter number 1:” read a echo “Enter number 2:” read b if [ $a -ge $b ] then echo “$a is greater than or equal to $b” else echo “$a is less than $b” fi String Comparison == is equal to if [ “$a” == “$b” ] != is not equal to if [ “$a” != “$b” ] Note: 1. Must have a space before and after [ and ]. 2. Must have spaces before and after operators == and != 3. Must use double quote for string variables 4. You can also use double quote for number variables. But, it is not required. Task 4 Ask user to enter two strings and display whether they are equal or not Script for Task 4 #!/bin/bash echo “Enter string 1:” read a echo “Enter string 2:” read b if [ “$a” == “$b” ] then echo "$a is same as $b" else echo "$a is different from $b" fi Logical Operators &&AND || OR Example: #!/bin/bash a=100 b=200 if ([ $a -gt 0 ] && [ $b -gt 0]) then echo "both $a and $b are positive" fi While Loop while [ condition ] do command(s)... done Note: keep working in loop as long as condition is true (terminate if condition is false) Task 5 Ask the user to continually enter an integer number and show the summation of all the numbers the user has entered so far. The program terminates when user enters word “end” No input error checking is required Scripts for Task 5 #!/bin/bash sum=0 echo "Enter a number(end to exit)" read n while [ "$n" != "end" ] do sum=$[$sum+$n] echo “The sum of the numbers you entered so far is $sum" echo "Enter a number(end to exit)" read n done Until Loop until [ condition ] do command(s)... done Keep in loop as long as condition is false (terminate when condition is true) Condition is opposite to while loop Scripts for Task 5 (using until loop) #!/bin/bash sum=0 echo "Enter a number(end to exit)" read n until [ "$n" == "end" ] do sum=$[$sum+$n] echo “The sum of the numbers you entered so far is $sum" echo "Enter a number(end to exit)" read n done A Note about Conditions in Brackets Always keep spaces between the brackets and the actual check/comparison Always keep spaces between comparison operators and variable (data) if [ $a -lt 0 ] while [ $a –gt $b ] until [ “$a” == “$b” ] For Loop for loop is used to extract items from a list for arg in $list_variable do command(s)... done For Loop Example #!/bin/bash fruits=“apples oranges pears bananas” for fruit in $fruits #fruits is considered as a list (items are separated by spaces) do echo $fruit # Each fruit on a separate line. done • Result apples oranges pears bananas For Loop Example #!/bin/bash fruits=“apples oranges pears bananas” for fruit in “$fruits” #fruits is considered as a single item do echo $fruit done Result: apples oranges pears bananas When to use double quote on string variable? Should use double quote: Single value string (no need to separate words) Should not use double quote: String is a list of word and we need to separate words from the list Command Substitution Assigns the output of a command to a variable variable_name=$(command) Example #!/bin/bash cw=$(pwd) echo cw Redirect Output to Files We can redirect the output of Shell Script from Screen to a File echo …….. >> file_name Task 6 Write a shell script so that it can output the following information to a file called test.txt Current working directory Number of files in current working directory Full path of each file in current working directory Script for Task 6 #!/bin/bash cw=$(pwd) files=$(ls) nf=$(ls | wc -w) echo "Current working directory is $cw" >> test.txt echo "There are $nf file(s), they are listed below" >> test.txt for file in $files do echo $cw/$file >> test.txt done Reading Assignment Chapters 8, 9, and 10