Shell Programming
Shell Programming
A shell is a special user program that provides an interface for the user to use operating
system services. Shell accepts human-readable commands from users and converts them
into something which the kernel can understand. It is a command language interpreter that
executes commands read from input devices such as keyboards or from files. The shell gets
started when the user logs in or starts the terminal.
There are several shells are available for Linux systems like –
• BASH (Bourne Again SHell) – It is the most widely used shell in Linux
systems. It is used as default login shell in Linux systems and in macOS. It can
also be installed on Windows OS.
• CSH (C SHell) – The C shell’s syntax and its usage are very similar to the C
programming language.
• KSH (Korn SHell) – The Korn Shell was also the base for the POSIX Shell
standard specifications etc.
Each shell does the same job but understands different commands and provides different
built-in functions.
What is a terminal?
A program which is responsible for providing an interface to a user so that he/she can
access the shell. It basically allows users to enter commands and see the output of those
commands in a text-based interface. Large scripts that are written to automate and perform
complex tasks are executed in the terminal.
Shell Scripting
Usually, shells are interactive, which means they accept commands as input from users and
execute them. However, sometimes we want to execute a bunch of commands routinely, so
we have to type in all commands each time in the terminal.
As a shell can also take commands as input from file, we can write these commands in a
file and can execute them in shell to avoid this repetitive work. These files are called Shell
Scripts or Shell Programs. Shell scripts are similar to the batch file in MS-DOS. Each
shell script is saved with `.sh` file extension e.g., myscript.sh.
A shell script has syntax just like any other programming language. If you have any prior
experience with any programming language like Python, C/C++ etc. It would be very easy
to get started with it.
A shell script comprises the following elements –
• Shell Keywords – if, else, break etc.
• Shell commands – cd, ls, echo, pwd, touch etc.
• Functions
• Control flow – if..then..else, case and shell loops etc.
Why do we need shell scripts?
There are many reasons to write shell scripts:
• To avoid repetitive work and automation
• System admins use shell scripting for routine backups.
• System monitoring
• Adding new functionality to the shell etc.
Some Advantages of shell scripts
• The command and syntax are exactly the same as those directly entered in the
command line, so programmers do not need to switch to entirely different syntax
• Writing shell scripts are much quicker
• Quick start
• Interactive debugging etc.
Some Disadvantages of shell scripts
• Prone to costly errors, a single mistake can change the command which might be
harmful.
• Slow execution speed
• Design flaws within the language syntax or implementation
• Not well suited for large and complex task
• Provide minimal data structure unlike other scripting languages. etc.\
Types of shell in Linux
8 Types of Linux Shells
• Bourne Shell (sh)
• C Shell (csh)
• TENEX C Shell (tcsh)
• KornShell (ksh)
• Debian Almquist Shell (dash)
• Bourne Again Shell (bash)
• Z Shell (zsh)
• Friendly Interactive Shell (fish)
It means the interpreter should be bash shell. If the first line is:
#!/bin/zsh
It means the interpreter to be used is Z shell.
The #! is surely special because # is used for comments in shell scripts but here it has a
special meaning.
Shell Scripting – Standard Input, Output and Error – FAQs
1. You can redirect the output of a shell script to a file using the ` >` operator. ...
2. You can use the ` read` command to prompt the user for input within a shell script. ...
3. You can use the ` >/dev/null 2>&1` redirection to discard both standard output and
standard error.
In programming, Decision making is one of the important concepts. The programmer
provides one or more conditions for the execution of a block of code. If the conditions are
satisfied then those block of codes only gets executed. Two types of decision-making
statements are used within shell scripting. They are –
• If-else statement
• case-sac statement
1. If-else statement
If else statement is a conditional statement. It can be used to execute two different codes
based on whether the given condition is satisfied or not. There are a couple of varieties
present within the if-else statement. They are –
•
if-fi
•
if-else-fi
•
if-elif-else-fi
•
nested if-else
The syntax will be –
if-fi
if [ expression ]; then
statements
fi
if-else-fi
if [ expression ]
then
statement1
else
statement2
fi
if-elif-else-fi
if [ expression1 ]
then
statement1
statement2
.
.
elif [ expression2 ]
then
statement3
statement4
.
.
else
statement5
fi
nested if-else
if [ expression ]
then
statement1
if [ expression ]
then
statement
else
statement
fi
else
statement2
fi
Now understand these concepts using examples.
Example of if-fi
Name="Satyajit"
if [ "$Name" = "Satyajit" ]; then
echo "His name is Satyajit. It is true."
fi
Output
His name is Satyajit. It is true.
In the above example, during the condition checking the name matches and the condition
becomes true. Hence, the block of code present within the if block gets executed. In case
the name doesn’t match then we will not have an output.
Example of if-else-fi
Age=17
if [ "$Age" -ge 18 ]; then
echo "You can vote"
else
echo "You cannot vote"
fi
Output
You cannot vote
In the above example, during the condition checking the Age is 17, so it doesn’t satisfy the
condition of if statement that is the age must be greater than or equal to 18. Hence the code
inside the if block will not get executed and the code written inside the else block will get
executed. Below is the terminal shell pictorial depiction after executing the following script
–
Example of if-elif-else-fi
Age=17
if [ "$Age" -ge 18 ]; then
echo "You can vote"
elif [ "$Age" -eq 17 ]; then
echo "You can vote after one year"
else
echo "You cannot vote"
fi
Output
You can vote after one year
In the above example, during the condition checking the Age is 17, so it doesn’t satisfy the
condition of if statement that is the age must be greater than or equal to 18 but it has
satisfied the elif condition. So, it has executed the code written within the elif block only.
if [ $subject == 'Linux' ]
then
echo "Enter Marks"
read marks
if [ $marks -ge 30 ]
then
echo "You passed"
else
echo "You failed"
fi
else
echo "Wrong Subject"
fi
Output 1
Enter subject
Linux
Enter Marks
97
You passed
Output 2
Enter subject
Linux
Enter Marks
29
You failed
Output 3
Enter subject
DBMS
Wrong Subject
In the above example, the if statements are nested, which means one if statement is written
inside another one. The following script first checks for the Subject is Linux or not. If the
subject is Linux then it goes to the another if statement and that if statement checks for the
mark are above to consider as a pass or not. Below is the terminal shell pictorial depiction
after executing the following script –
The file-based decision is basically a type of decision-making based on whether the file
exists or not. A use case of this will be to check for available file permission or to create a
file if it is not available etc. A minimal structure of such script can be written as –
if [ -e gfg.sh ]
then
echo "file exists"
else
echo "file does not exist"
fi
This can be used to check whether a file exists in the home directory or not.
Example of file-based decision
echo "Enter filename"
read filename
if [ -e $filename ]
then
echo "$filename is exits on the directory"
cat $filename
else
cat > $filename
echo "File created"
fi
Output :
First time:
Enter filename
geeks.txt
Hello Geek
File created
Second time:
Enter filename
geeks.txt
geeks.txt is exits on the directory
Hello Geek
So, in this above example the first time, the script could not find any file with that file
name, and the else block gets executed. It created the file and put some data into that file.
When we run it a second time with the same file name, then it finds the file. So, is the if
block gets executed and that displays the contents of the file. Below is the terminal shell
pictorial depiction after executing the following script –
The string-based condition means in the shell scripting we can take decisions by doing
comparisons within strings as well. Here is a descriptive table with all the operators –
Operator Description
# !=
if [ 'Geeks' != 'Apple' ];
then
echo "not same" #output
else
echo "same"
fi
# -n
if [ -n "Geeks" ];
then
echo "not null" #output
else
echo "null"
fi
# -z
if [ -z "Geeks" ];
then
echo "null"
else
echo "not null" #output
fi
Output:
same
not same
not null
not null
Below is the terminal shell pictorial depiction after executing the following script –
Arithmetic operators are used for checking the arithmetic-based conditions. Like less than,
greater than, equals to, etc. Here is a descriptive table with all the operators –
Operator Description
-eq Equal
# -ge
if [ 10 -ge 9 ];then
echo "Greater or equal"
fi
# -gt
if [ 10 -gt 8 ];then
echo "Greater"
fi
# -le
if [ 10 -le 12 ];then
echo "Less than or equal"
fi
# -lt
if [ 10 -lt 13 ];then
echo "Less than"
fi
# -ne
if [ 10 -ne 13 ];then
echo "Not Equal"
fi
Output:
Equal
Greater or equal
Greater
Less than or equal
Less than
Not Equal
Below is the terminal shell pictorial depiction after executing the following script –
#case 2
"Vikas") echo "Profession : Web Developer" ;;
#case 3
"Satyajit") echo "Profession : Technical Content Writer" ;;
esac
Output
Profession : Technical Content Writer
In the above example, the case-sac statement executed the statement which is a part of the
matched pattern here the ‘Name’. Below is the terminal shell pictorial depiction after
executing the following script –
#/bin/bash
a=0
# lt is less than operator
#Iterate the loop until a less than 10
while [ $a -lt 10 ]
do
# Print the values
echo $a
# increment the value
a=`expr $a + 1`
done
Explanation:
• #/bin/bash: Specifies that the script should be interpreted using the Bash shell.
• a=0: Initializes a variable a with the value 0.
• while [ $a -lt 10 ]: Initiates a while loop that continues as long as the value a is
less than 10.
• do: Marks the beginning of the loop’s body.
• echo $a: Prints the current value of a the console.
• a=expr $a + 1“: Increments the value of a by 1. The expr command is used for
arithmetic expressions.
• done: Marks the end of the loop.
for` statement in Shell Script in Linux
The for loop operates on lists of items. It repeats a set of commands for every item in a list.
Here var is the name of a variable and word1 to wordN are sequences of characters
separated by spaces (words). Each time the for loop executes, the value of the variable var
is set to the next word in the list of words, word1 to wordN.
Syntax:
#/bin/bash
for <var> in <value1 value2 ... valuen>
do
<command 1>
<command 2>
<etc>
done
Implementation of `for` Loop with `break` statement in Shell Script.
First, we create a file using a text editor in Linux. In this case, we are using `vim`editor.
vim for.sh
#/bin/bash
#Start of for loop
for a in 1 2 3 4 5 6 7 8 9 10
do
# if a is equal to 5 break the loop
if [ $a == 5 ]
then
break
fi
# Print the value
echo “Iteration no $a”
done
Explanation:
• #/bin/bash: Specifies that the script should be interpreted using the Bash shell.
• for a in 1 2 3 4 5 6 7 8 9 10: Initiates a for loop that iterates over the values 1
through 10, assigning each value to the variable a in each iteration.
• do: Marks the beginning of the loop’s body.
• if [ $a == 5 ]: Checks if the current value a is equal to 5.
• then: Marks the beginning of the conditional block to be executed if
the condition is true.
• break: Exits the loop if the condition is true.
• fi: Marks the end of the conditional block.
• echo "Iteration no $a": Prints a message indicating the current iteration number.
• done: Marks the end of the loop.