630 likes | 921 Views
Shell Programming. University of Maryland Eastern Shore Dept. of Computer Science Jianhua Yang. Outline. Unix Shell programming: Shell scripts. Definition. Uses of shell scripts. Writing shell scripts. Shell scripts. A shell script is a text file with Unix commands in it.
E N D
Shell Programming University of Maryland Eastern Shore Dept. of Computer Science Jianhua Yang CSDP399 Introduction to Unix and Programming
Outline • Unix Shell programming: • Shell scripts. • Definition. • Uses of shell scripts. • Writing shell scripts. CSDP399 Introduction to Unix and Programming
Shell scripts • A shell script is a text file with Unix commands in it. • Shell scripts usually begin with a #! and a shell name (complete pathname of shell). • Pathname of shell be found using the which command. • The shell name is the shell that will execute this script. • E.g: #!/bin/bash CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • If no shell is specified in the script file, the default is chosen to be the currently executing shell. CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Any Unix command can go in a shell script • Commands are executed in order or in the flow determined by control statements. • Different shells have different control structures • The #! line is very important. • We will write shell scripts with the Bourne shell (bash). CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • A shell script as a standalone is an executable program: • Must use chmod to change the permissions of the script to be executable also. • Can run script explicitly also, by specifying the shell name. • E.g: $ bash myscript • E.g: $ csh myscript CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Consider the example • $ bash myscript • Invokes the bash shell and then runs the script using it. • Its almost as if we had the line #! /bin/bash in the file myscript. • Similarly with the second example using csh. • myscript need not be an executable as bash is running the script on its behalf. CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Why write shell scripts ? • To avoid repetition: • If you do a sequence of steps with standard Unix commands over and over, why not do it all with just one command? • Or in other words, store all these commands in a file and execute them one by one. • To automate difficult tasks: • Many commands have subtle and difficult options that you don’t want to figure out or remember every time . CSDP399 Introduction to Unix and Programming
Simple Example • Assume that I need to execute the following commands once in a while when I run out of disk space: rm -rf $HOME/.netscape/cache rm -f $HOME/.netscape/his* rm -f $HOME/.netscape/cookies rm -f $HOME/.netscape/lock rm -f $HOME/.netscape/.nfs* rm -f $HOME/.pine-debug* rm -fr $HOME/nsmail CSDP399 Introduction to Unix and Programming
Simple Example (contd.) • We can put all those commands into a shell script, called myscript. [axgopala@nitrogen axgopala]$ cat myscript #! /bin/bash rm -rf $HOME/.netscape/cache rm -f $HOME/.netscape/his* rm -f $HOME/.netscape/cookies rm -f $HOME/.netscape/lock rm -f $HOME/.netscape/.nfs* rm -f $HOME/.pine-debug* rm -fr $HOME/nsmail CSDP399 Introduction to Unix and Programming
Sample Example (contd.) • To run the script: • Step 1: • $ chmod u+x myscript • Step 2: • Run the script: • $ ./myscript • Each line of the script is processed in order. CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Shell variables: • Declared by: • varname=varvalue • To make them an environment variable, we export it. • export varname=varvalue CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Assigning the output of a command to a variable: • Using backquotes, we can assign the output of a command to a variable: #! /bin/bash filelist=`ls` echo $filelist CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • Example: [axgopala@nitrogen public]$ ls a b c html/ [axgopala@nitrogen public]$ filelist=`ls` [axgopala@nitrogen public]$ echo $filelist a b c html/ [axgopala@nitrogen public]$ CSDP399 Introduction to Unix and Programming
Shell scripts (contd.) • The expr command: • Calculates the value of an expression. • E.g: [axgopala@nitrogen axgopala]$ value=`expr 1 + 2` [axgopala@nitrogen axgopala]$ echo $value 3 [axgopala@nitrogen axgopala]$ CSDP399 Introduction to Unix and Programming
Notes on expr • Why do we need the expr command ??? • E.g: [axgopala@nitrogen public]$ file=1+2 [axgopala@nitrogen public]$ echo $file 1+2 [axgopala@nitrogen public]$ NOTE: 1+2 is copied as it is into val and not the result of the expression, to get the result, we need expr. CSDP399 Introduction to Unix and Programming
Notes on expr • Variables as arguments: [axgopala@nitrogen axgopala]$ count=5 [axgopala@nitrogen axgopala]$ count=`expr $count + 1` [axgopala@nitrogen axgopala]$ echo $count 6 [axgopala@nitrogen axgopala]$ • NOTE: count is replaced with its value by • the shell! CSDP399 Introduction to Unix and Programming
Notes on expr • expr supports the following operators: • arithmetic operators: +,-,*,/,% • comparison operators: <, <=, ==, !=, >=, > • boolean/logical operators: &, | • parentheses: (, ) • precedence is the same as C, Java CSDP399 Introduction to Unix and Programming
Control statements • Without control statements, execution within a shell scripts flows from one statement to the next in succession. • Control statements control the flow of execution in a programming language. CSDP399 Introduction to Unix and Programming
Control statements • The three most common types of control statements: • conditionals: if/then/else, case, ... • loop statements: while, for, until, do, ... • branch statements: subroutine calls (good programming practice), goto (usage not recommended). CSDP399 Introduction to Unix and Programming
for loops • for loops allow the repetition of a command for a specific set of values. • Syntax: for var in value1 value2 ... do command_set done • command_set is executed with each value of var (value1, value2, ...) in sequence CSDP399 Introduction to Unix and Programming
Notes on for • Example: Listing all files in a directory. #! /bin/bash for i in * do echo $i done NOTE: * is a wild card that stands for all files in the current directory, and for will go through each value in *, which is all the files and $i has the filename. CSDP399 Introduction to Unix and Programming
Notes on for • Example output: [axgopala@nitrogen public]$ chmod u+x listfiles [axgopala@nitrogen public]$ ./listfiles a b c html listfiles [axgopala@nitrogen public]$ CSDP399 Introduction to Unix and Programming
Conditionals • Conditionals are used to “test” something. • In Java or C, they test whether a Boolean variable is true or false. • In a Bourne shell script, the only thing you can test is whether or not a command is “successful”. CSDP399 Introduction to Unix and Programming
Conditionals • Every well behaved command returns back a return code. • 0 if it was successful • Non-zero if it was unsuccessful (actually 1..255) • This is different from C. CSDP399 Introduction to Unix and Programming
The if command • Simple form: if decision_command_1 then command_set_1 fi CSDP399 Introduction to Unix and Programming
The if command • Importance of having then on the next line: • Each line of a shell script is treated as one command. • then is a command in itself • Even though it is part of the if structure, it is treated separately. CSDP399 Introduction to Unix and Programming
grep returns 0 if it finds something returns non-zero otherwise redirect to /dev/null so that "intermediate" results do not get printed Example if grep unix myfile >/dev/null then echo "It's there" fi CSDP399 Introduction to Unix and Programming
Using else with if • Example: #! /bin/bash if grep "UNIX" myfile >/dev/null then echo UNIX occurs in myfile else echo No! echo UNIX does not occur in myfile fi CSDP399 Introduction to Unix and Programming
Using elif with if #! /bin/bash if grep "UNIX" myfile >/dev/null then echo UNIX occurs in myfile elif grep “DOS” myfile > /dev/null then echo DOS appears in myfile not UNIX else echo nobody is here in myfile fi CSDP399 Introduction to Unix and Programming
Using colon in shell scripts • Sometimes, we do not want a statement to do anything. • In that case, use a colon ‘:’ • if grep UNIX myfile > /dev/null • then • : • fi • Does not do anything when UNIX is found in myfile . CSDP399 Introduction to Unix and Programming
The test command • Use for checking validity. • Three kinds: • Check on files. • Check on strings. • Check on integers CSDP399 Introduction to Unix and Programming
File attributes Tests CSDP399 Introduction to Unix and Programming
Example #!/bin/bash count=0 for i in *; do if test –x $i then count=`expr $count + 1` fi done echo Total of $count files executable NOTE: expr $count + 1 serves the purpose of count++ CSDP399 Introduction to Unix and Programming
More about Using test and [] to evaluate expressions • Number comparison CSDP399 Introduction to Unix and Programming
Using Test • test $x –gt $y compare two numbers • test $x -eq $y • test $x –ls $y CSDP399 Introduction to Unix and Programming
examples • x=5; y=7; z=7.2 • test $x –eq $y; echo $? • test $x –lt $y; echo $? • test $z –gt $y; echo $? CSDP399 Introduction to Unix and Programming
[]: Shorthand for test • test $x –eq $y [ $x –eq $y ] CSDP399 Introduction to Unix and Programming
String comparison • s1=s2 equal? • s1!=s2 not equal? • -n stg stg is not a null string • -z stg stg is a null string • stg stg is assigned and not null • s1==s2 (Korn and Bash shell only) CSDP399 Introduction to Unix and Programming
Examples • If [“$option” = “y”] • If [“$option”!=“y”] CSDP399 Introduction to Unix and Programming
Notes on test • Testing on strings. • test –z string: is string of length 0? • test string1 = string2: does string1 equal string2? • test string1 != string2: not equal? CSDP399 Introduction to Unix and Programming
Example #! /bin/bash if test -z $REMOTEHOST then : else DISPLAY="$REMOTEHOST:0“ export DISPLAY fi NOTE: This example tests to see if the value of REMOTEHOST is a string of length > 0 or not, and then sets the DISPLAY to the appropriate value. CSDP399 Introduction to Unix and Programming
Example #!/bin/bash smallest=10000 for i in 5 8 19 8 7 3 do if test $i -lt $smallest then smallest=$i fi done echo $smallest NOTE: This program calculates the smallest among the numbers 5, 8, 19, 8, 3. CSDP399 Introduction to Unix and Programming
Notes on test • The test command has an alias ‘[]’. • Each bracket must be surrounded by spaces #!/bin/bash smallest=10000 for i in 5 8 19 8 7 3 do if [ $i -lt $smallest ] then smallest=$i fi done echo $smallest CSDP399 Introduction to Unix and Programming
The while loop • While loops repeat statements as long as the next Unix command is successful. • Works similar to the while loop in C. CSDP399 Introduction to Unix and Programming
Example #! /bin/bash i=1 sum=0 while [ $i -le 100 ] do sum=`expr $sum + $i` i=`expr $i + 1` done echo The sum is $sum. NOTE: The value of i is tested in the while to see if it is less than or equal to 100. CSDP399 Introduction to Unix and Programming
The untilloop • Until loops repeat statements until the next Unix command is successful. • Works similar to the do-while loop in C. CSDP399 Introduction to Unix and Programming
Example #! /bin/bash x=1 until [ $x -gt 3 ] do echo x = $x x=`expr $x + 1` done NOTE: The value of x is tested in the until to see if it is greater than 3. CSDP399 Introduction to Unix and Programming
Read • Making scripts interactive • Example 13.2 #! /bin/bash echo “Enter the pattern to be searched” read pname echo “Enter the file to be used” read fname echo “Searching for $pname from file $fname” grep “$pname” $fname echo “Selected lines shown above” CSDP399 Introduction to Unix and Programming
Using Command Line Arguments • Like c program to read positional parameters • $0, $1, $2,… • Special parameters • $* - stores the complete set of positional parameters as single string • $# - the number of arguments specified • $? – exit status of last command CSDP399 Introduction to Unix and Programming