LINUX Shell Scripting
Advanced Issues
Yusuf Altunel
1
Content
Commands
Command Line Arguments
Redirection of Input/Output
Pipes and Filters
Programming in Background
Conditionals
if
test
if else fi
Loops
for loop
do loop
2
The read Statement
Use to get input (data from user) from keyboard and
store (data) to variable.
Syntax:
read variable1, variable2,...variableN
Example: Write a shell script to
first ask user, name
then waits to enter name from the user via keyboard.
Then user enters name from keyboard (after giving name you
have to press ENTER key)
entered name through keyboard is stored (assigned) to
variable fname.
Solution is in the next slide
3
Example (read Statement)
$ vi sayH
#
#Script to read your name from key-board
#
echo "Your first name please:"
read fname
echo "Hello $fname, Lets be friend!"
Run it as follows:
$ chmod 755 sayH
$ ./sayH
Your first name please: vivek
Hello vivek, Lets be friend!
4
Wild Cards
Wild card
Meaning Examples
/Shorthand
$ ls * will show all files
will show all files whose first name is starting with
$ ls a*
letter 'a'
Matches any string
* or group of
characters. $ ls *.c will show all files having extension .c
will show all files having extension .c but file name
$ ls ut*.c
must begin with 'ut'.
$ ls ? will show all files whose names are 1 character long
Matches any single
?
character. will show all files whose names are 3 character long
$ ls fo?
and file name begin with fo
Matches any one of
[...] the enclosed $ ls [abc]* will show all files beginning with letters a,b,c
characters
5
More commands on one command line
Syntax:
command1;command2
To run two command in one command line.
Examples:
$ date;who
Will print today's date followed by users who are currently
login.
Note that You can't use
$ date who
for same purpose, you must put semicolon
in between the date and who command.
6
Command Line Arguments
1. Telling the command/utility
which option to use.
2. Informing the utility/command
which file or group of files to process
Let's take rm command,
is used to remove file,
which of the file?
how to tail this to rm command
rm command does not ask the name of the file
So what we do is to write command as follows:
$ rm {file-name}
rm : is the command
file-name :file to remove
7
Arguments - Specification
$ myshell foo bar
Shell Script name i.e. myshell
First command line argument passed to myshell i.e. foo
Second command line argument passed to myshell i.e. bar
In shell if we wish to refer this command line argument we refer above as
follows
myshell it is $0
foo it is $1
bar it is $2
•Here $# (built in shell variable ) will be 2 (Since foo and bar only two
Arguments),
•Please note at a time such 9 arguments can be used from $1..$9,
•You can also refer all of them by using $* (which expand to `$1,$2...$9`).
•Note that $1..$9 i.e command line arguments to shell script is know as
"positional parameters".
8
Arguments - Example
$ vi demo
#!/bin/sh
#
# Script that demos, command line args
#
echo "Total number of command line argument are $#"
echo "$0 is script name"
echo "$1 is first argument"
echo "$2 is second argument"
echo "All of them are :- $* or $@"
•Run it as follows
•Set execute permission as follows:
$ chmod 755 demo
•Run it & test it as follows:
$ ./demo Hello World
•If test successful, copy script to your own bin directory (Install script for private use)
$ cp demo ~/bin
•Check whether it is working or not (?)
$ demo
$ demo Hello World
9
Redirection of Input/Output
In Linux (and in other OSs also)
it's possible to send output to file
or to read input from a file
For e.g.
$ ls command gives output to screen;
to send output to file of ls command give command
ls > filename
It means put output of ls command to filename.
10
redirection symbols: ‘>’
There are three main redirection symbols: >,>>,<
(1) > Redirector Symbol
Syntax:
Linux-command > filename
To output Linux-commands result to file.
Note that if the file already exist,
it will be overwritten
else a new file will be created.
For e.g.
To send output of ls command give
$ ls > myfiles
if 'myfiles' exist in your current directory
it will be overwritten without any warning.
11
redirection symbols: ‘>>’
(2) >> Redirector Symbol
Syntax:
Linux-command >> filename
To output Linux-commands result
to the END of the file.
if file exist:
it will be opened
new information/data will be written to the END of the file,
without losing previous information/data,
if file does not exist, a new file is created.
For e.g.
To send output of date command
to already exist file give command
$ date >> myfiles
12
redirection symbols: ‘<’
(3) < Redirector Symbol
Syntax:
Linux-command < filename
To provide input to Linux-command
from the file instead of standart input (key-board).
For e.g. To take input for cat command give
$ cat < myfiles
13
Pipes
A pipe is a way
to connect the output of one program
to the input of another program
without any temporary file.
Definition
"A pipe is nothing but a temporary storage place
where the output of one command
is stored and then passed
as the input for second command.
Pipes are used
to run more than two commands
Multiple commands
from same command line."
Syntax:
command1 | command2
14
Pipe - Examples
Command using Pipes Meaning or Use of Pipes
Output of ls command is given as input to the command more
$ ls | more So output is printed one screen full page at a time.
Output of who command is given as input to sort command
$ who | sort
So it will print sorted list of users
$ who | sort > Same as above except output of sort is send to (redirected) the file
user_list named user_list
who command provides the input of wc command
$ who | wc -l
So it will count the users logged in.
ls command provides the input of wc command
$ ls -l | wc -l
So it will count files in current directory.
Output of who command is given as input to grep command
So it will print if particular user is logged in. Otherwise nothing is
$ who | grep raju
printed
15
Filter
Accepting the input
from the standard input
and producing the result
on the standard output
is know as a filter.
A filter
performs some kind of process on the input
and provides output.
16
Filter: Examples
Suppose you have a file
called 'hotel.txt'
with 100 lines data,
you would like to print the content
only between the line numbers 20 and 30
and then store this result to the file 'hlist'
The appropriate command:
$ tail +20 < hotel.txt | head -n30 >hlist
Here head command is filter:
takes its input from tail command
tail command starts selecting
from line number 20 of given file
i.e. hotel.txt
and passes this lines as input to the head,
whose output is redirected
to the 'hlist' file.
17
Filter: Examples
Consider one more following example
$ sort < sname | uniq > u_sname
Here uniq is filter
takes its input from sort command
and redirects to "u_sname" file.
18
Processing in Background
Use ampersand (&)
at the end of command
To start the execution in background
and enable the user to continue his/her processing
during the execution of the command
without interrupting
$ ls / -R | wc -l
This command will take lot of time
to search all files on your system.
So you can run such commands
in Background or simultaneously
by adding the ampersand (&):
$ ls / -R | wc -l&
19
Commands Related With Processes
For this purpose Use this Command Examples
To see currently running process ps $ ps
To stop any process by PID i.e. to kill process kill {PID} $ kill 1012
To stop processes by name i.e. to kill process killall {Proc-name} $ killall httpd
To get information about all running process ps -ag $ ps -ag
To stop all process except your shell kill 0 $ kill 0
For background processing (With &, use to put linux-command & $ ls / -R | wc -l &
particular command and program in background)
To display the owner of the processes along with ps aux $ ps aux
the processes
For e.g. you want to see whether
To see if a particular process is running or not. Apache web server process is
For this purpose you have to use ps command in ps ax | grep {Proc-name}
running or not then give command
combination with the grep command $ ps ax | grep httpd
To see currently running processes and other $ top
information like memory and CPU usage with real top Note that to exit from
top command press q.
time updates.
To display a tree of processes pstree $ pstree
20
if condition
if condition
used for making decisions in shell script,
If the condition is true
then command1 is executed.
Syntax:
if condition then command1 if condition is true or if
exit status of condition is 0 (zero) ... ... fi
condition
is defined as:
"Condition is nothing but comparison between two values."
For compression
you can use test
or [ expr ] statements
or even exist status
21
if condition - Examples
$ cat > showfile
#!/bin/sh
#
#Script to print file
#
if cat $1
then
echo -e "\n\nFile $1, found and successfully echoed"
fi
Run above script as:
$ chmod 755 showfile
$./showfile foo
Shell script name is: showfile ($0)
The argument is foo ($1).
Then shell compare it as follows:
if cat $1 :is expanded to if cat foo.
22
Example: Detailed explanation
if cat command finds foo file
and if its successfully shown on screen,
it means our cat command
is successful and
its exist status is 0 (indicates success),
So our if condition is also true
the statement echo -e "\n\nFile $1, found and successfully echoed"
is proceed by shell.
if cat command is not successful
then it returns non-zero value
indicates some sort of failure
the statement echo -e "\n\nFile $1, found and successfully
echoed"
is skipped by our shell.
23
test command or [ expr ]
test command or [ expr ]
is used to see if an expression is true,
and if it is true it return zero(0),
otherwise returns nonzero for false.
Syntax:
test expression or [ expression ]
24
test command - Example
determine whether given argument number is positive.
$ cat > ispostive
#!/bin/sh
#
# Script to see whether argument is positive
#
if test $1 -gt 0
then
echo "$1 number is positive"
fi
Run it as follows
$ chmod 755 ispostive
$ ispostive 5
5 number is positive
$ispostive -45
Nothing is printed
25
Mathematical Operators
Normal
Mathematical
Arithmetical/
Operator Meaning But in Shell
Mathematical
in Shell Script
Statements
For test
For [ expr ] statement
statement with
if command with if command
-eq is equal to 5 == 6 if test 5 -eq 6 if [ 5 -eq 6 ]
-ne is not equal to 5 != 6 if test 5 -ne 6 if [ 5 -ne 6 ]
-lt is less than 5<6 if test 5 -lt 6 if [ 5 -lt 6 ]
-le is less than or equal to 5 <= 6 if test 5 -le 6 if [ 5 -le 6 ]
-gt is greater than 5>6 if test 5 -gt 6 if [ 5 -gt 6 ]
-ge is greater than or equal to 5 >= 6 if test 5 -ge 6 if [ 5 -ge 6 ]
26
String Operators
Operator Meaning
string1 = string2 string1 is equal to string2
string1 != string2 string1 is NOT equal to string2
string1 string1 is NOT NULL or not defined
-n string1 string1 is NOT NULL and does exist
-z string1 string1 is NULL and does exist
27
File and Directory Operators
Test Meaning
-s file Non empty file
-f file File exists or is a normal file and not a directory
-d dir Directory exists and not a file
-w file file is a writeable file
-r file file is a read-only file
-x file file is executable
28
Logical Operators
Operator Meaning
! expression Logical NOT
expression1 -a expression2 Logical AND
expression1 -o expression2 Logical OR
29
if...else...fi
If given condition is true
then command1 is executed
otherwise command2 is executed.
Syntax:
if condition
then
condition is zero (true - 0)
execute all commands up to else statement
else
if condition is not true then
execute all commands up to fi
fi
30
if...else…fi
$ vi isnump_n
-Example
#!/bin/sh Try it as follows:
#
$ chmod 755 isnump_n
# Script to see whether argument is
$ isnump_n 5
positive or negative
5 number is positive
#
if [ $# -eq 0 ]
$ isnump_n -45
then -45 number is negative
echo "$0 : You must give/supply one
integers"
exit 1 $ isnump_n
fi ./ispos_n : You must
if test $1 -gt 0 give/supply one integers
then
echo "$1 number is positive" $ isnump_n 0
else echo "$1 number is negative“ 0 number is negative
fi
31
Loops in Shell Scripts
Bash supports:
for loop
while loop
Note that in each and every loop,
(a) First, the variable used in loop condition
must be initialized,
then execution of the loop begins.
(b) A test (condition) is made
at the beginning of each iteration.
(c) The body of loop ends
with a statement modifies
the value of the test (condition) variable.
32
for Loop
Syntax:
for { variable name } in { list }
do
execute one for each item in the list
until the list is not finished
(And repeat all statements between do and done)
done
33
for Loop: Example
Example:
$ cat > testfor •The for loop first creates i variable
for i in 1 2 3 4 5 •and assigned a number to i from the
do list of numbers 1 to 5,
•The shell executes echo statement for each
echo "Welcome $i times" assignment of i.
•This process will continue until all the
done items in the list were not finished,
•because of this it will repeat 5 echo
statements.
Run it above script as follows:
$ chmod +x testfor
$ ./testfor
34
for loop - Example
$ vi chessboard
for (( i = 1; i <= 9; i++ )) ### Outer for loop ###
do
for (( j = 1 ; j <= 9; j++ )) ### Inner for loop ###
do
tot=`expr $i + $j`
tmp=`expr $tot % 2`
if [ $tmp -eq 0 ]; then
echo -e -n "\033[47m "
else
echo -e -n "\033[40m "
fi
done
echo -e -n "\033[40m" #### set back background colour to
black
echo "" #### print the new line ###
done
35
while Loop
Syntax:
while [ condition ]
do
command1
command2
..
....
done
Example:
while [ $i -le 10 ]
do
echo "$n * $i = `expr $i \* $n`"
i=`expr $i + 1`
done
36
End of Chapter
LINUX Shell Scripting
Advanced Issues
37