In the last chapter, you learned about performing arithmetic operations in various ways such as using declare, let, expr, and arithmetic expressions. You also learned about representing numbers in different bases such as hex, octal, and binary, and using the bc utility for performing floating point or fractional arithmetic.
In real-world scripts, it is not just a sequential execution of commands, we need to check certain conditions or proceed as per certain logic and accordingly the script should continue executing. This is precisely what we do with automation. Automation refers to performing tasks, the sequence of which will change as per changes in the programming environment. A simple example would be to check if the directory is present; if present, then change to that directory, otherwise create a new directory and proceed. All these activities come under decision making in Shell scripts.
In this chapter, we will cover the following topics:
testif-elsecaseselectfor loopwhile loopcontinue statementbreak statementAutomation using Shell scripts involves checking if the earlier command executed successfully or failed, if the file is present or not, and so on. You will learn various constructs such as if, case, and so on, where we will need to check whether certain conditions are true or false. Accordingly, our script should conditionally execute various commands.
Let's enter the following command:
$ ls
Using the Bash shell, we can check if the preceding command executed successfully or failed as follows:
$ echo $?
The preceding command will return 0, if the ls command executed successfully. The result will be nonzero, such as 1 or 2 or any other nonzero number, if the command has failed. The Bash shell stores the status of the last command execution in a variable. If we need to check the status of the last command execution, then we should check the content of the variable.
Let's see the following example:
$ x=10 $ y=20 $ (( x < y )) $ echo $? 0
This indicates that the $(( x < y )) expression has executed successfully.
Let's learn the same concept in the case of string handling:
$ name=Ganesh $ grep "$name" /etc/passwd Ganesh:9ZAC5G:6283:40:Ganesh Naik:/home/ganesh:/bin/sh $ echo $? 0
Since the user Ganesh is already created on the computer, the string Ganesh was found in the /etc/passwd file.
$ name=John $ grep "$name" /etc/passwd $ echo $? 1 # non zero values means error
Since the user John was not found in the /etc/passwd file, the grep command returned a nonzero value. In scripts, we can use this during automation.