Shell (BASH) Scripting QuickStart Guide for Administrators

What is ShellScripting ?

  • Shell scripting is used to automate certain tasks, make processes easy for user such as installation, monitor system resources, etc.
  • Default linux shell is BASH -> Bourne Again Shell replacement for Bourne Shell. Written by Brian Fox.
  • It is basically an interpretter, which interprete our commands and convert it into binary for CPU to understand.
  • Bash also can read commands from file which is also called as Script.
  • Script is nothing but a sequence of commands in a simple ASCII text

How to write bash script ?

Shebang Line:

#!/bin/bash –> Shebang line

Every shell script starts with this Shebang line.

#!<interpreter> <options>

When I write a script abc.sh. In that I have mentioned shebang line as #!/bin/csh

Then when I execute that script by “./abc.sh”, actually it will get executed like:

/bin/csh abc.sh

Please note that # is used to comment line in Shell scripting. If you want to any line just for information or not to execute then you should put ‘#’ in the beginning of that line.

eg. test.sh

#!/bin/bash –> Shebang line

echo “Hello World”

And to execute it, Please go into the directory where that shellscript is stored and run

./test.sh

 

Variables & echo statement

Variables are container and when we call it with $ that means we are opening the container and getting what is inside.

define varialbles by <variable>=value eg. var=123

getting variable value by using $ sign: echo $var

Reading keyboard inputs

echo -e “What is your name: c”

read <variable_name> eg. read myname

To get value of “myname” use echo $myname

File Descripters and redirecting

File Descriptors : 0 –> stdin Def:keyboard

                                 : 1 –> stdout Def:screen

                                 : 2 –> stderr Def:screen

                                : /dev/null – Bit Bucket

To redirect output of command to a file

command > /path/to/file

To redirect errors of command to a file

command 2> /path/to/file

To redirect both output and errors to a file

command > /path/to/file 2>&1

To hide output and error of command

command > /dev/null 2>&1

 

Executing commands inside script using backtick

val=`uname -a`

echo $val —> you will get output of ‘uname -a’ command.

 

If” statement

if [ $var <operator> value ]

then

            <command>

else

            <command>

fi

operators:

-lt or < –> less than

-gt or > –> greater than

-le or <= –> less than and equal to

-ge or >= –> greater than and equal to

-eq or == –> equal

Please remember comparing variable with numerical value for maximum compatibility use -lt,-gt instead of symbolic operators.

 

case” statement

case $val in

                    value1)

                          commands

                          ;;

                  value2)

                         commands

                         ;;

                 *)

                         default commands

                          ;;

esac

 

Function

Function is a set of commands which are repeatedly require in same or different scripts

To define function

function_name() {

              command1

              command2

             ….

}

To call function in same script

function_name

 

To call functions in other shellscript

Write all required functions in one file

Call that file inside shellscript

source </path/to/script name> OR

. </path/to/script_name>

 

and call function name directly.

 

What is Retrun code $?

Whenever we execute any command, it stores an exit value to bash. That value is called return code.

if return code is 0 then command executed successfully or else command failed.

To get return code, give “echo $?” immidiate after executing command.

Eg. To test return code using if statement

var=`echo $?` —> Enter value of return code in Variable

if [ $var == 0 ]

then

        command

else

      command

fi

 

Passing arugements to script .. $0 $1 $2

<script_name> argument1 argument2

             |                         |                     |

             |                         |                     |

          $0                      $1                   $2

So if I want argument1 should be used inside the script then

In script I should get the value of argument1 by using “echo $1” command.

 

Conditional expressions in if statement

-a file    –> True if file exists.

-b file    –> True if file exists and is a block special file.

-c file     –> True if file exists and is a character special file.

-d file    –> True if file exists and is a directory.

-e file    –> True if file exists.

-f file    –> True if file exists and is a regular file.

-g file    –> True if file exists and its set-group-id bit is set.

-h file    –> True if file exists and is a symbolic link.

-k file    –> True if file exists and its “sticky” bit is set.

-p file    –> True if file exists and is a named pipe (FIFO).

-r file    –> True if file exists and is readable.

-s file    –> True if file exists and has a size greater than zero.

-t fd    –> True if file descriptor fd is open and refers to a terminal.

-u file    –> True if file exists and its set-user-id bit is set.

-w file    –> True if file exists and is writable.

-x file    –> True if file exists and is executable.

-O file    –> True if file exists and is owned by the effective user id.

-G file    –> True if file exists and is owned by the effective group id.

-L file    –> True if file exists and is a symbolic link.

-S file    –> True if file exists and is a socket.

-N file    –> True if file exists and has been modified since it was last read.

file1 -nt file2    –> True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.

file1 -ot file2    –> True if file1 is older than file2, or if file2 exists and file1 does not.

file1 -ef file2    –> True if file1 and file2 refer to the same device and inode numbers.

-o optname    –> True if shell option optname is enabled. The list of options appears in the description of the -o option to the set builtin (see The Set Builtin).

-z string    –> True if the length of string is zero.

example 1 ++++ Checking file ++++:

if [ -f /var/log/messages ]

then

      echo -e “Yes messages file is there”

else

      echo -e “No messages file is not there”

fi

example 2 ++++ checking strings +++++

val=`df -h|grep neelesh`

if [ -z $val ]

     then

     echo “Neelesh partition is not mounted”

else

     echo “Neelesh partition is mounted”

fi

 

for” loop

for varname in list

do

     command1

     command2

done

Here for, in, do, done are keywords.

list contain list of values

varname is any bash variable name

 

example 1: ++++

for i in 1 2 3 4 5

do

     echo “Welcome $i times”

done

example 2: ++++

for i in {1..5}

do

     echo “Welcome $i times”

done

example 3: ++++

for i in {0..10..2}

do

     echo “Welcome $i times”

done

example 4: ++++

for i in $(seq 1 2 20)

do

     echo “Welcome $i times”

done

 

example 5: ++++

for (( EXP1; EXP2; EXP3 ))

do

     command1

     command2

     command3

done

——————

for (( i=1; i<=7; i++))

do

     echo “Welcome $i times”

done

 

while” loop

while [ condition ]

do

     command1

     command2

     command3

done

 

example 1: ++++

x=1

while [ $x -le 5 ]

do

     echo “Welcome $x times”

     x=$(( $x + 1 ))

done

example 2: ++++

Script.sh

#!/bin/bash

counter=$1

factorial=1

while [ $counter -gt 0 ]

do

     factorial=$(( $factorial * $counter ))

     counter=$(( $counter – 1 ))

done

echo $factorial

 

Basic regular expressions

A regular expression is a pattern that describes a set of strings.

Regular expressions are constructed analogously to arithmetic expressions by using various operators to combine smaller expressions.

Most characters, including all letters and digits, are regular expressions that match themselves. Any metacharacter with special meaning may be quoted by preceding it with a backslash.

Use of regular expressions provides the ability to perform multiple tasks at one time,

regular expressions save time and resources on a server. Instead of performing many passes

over the same text in order to achieve one goal at a time, you can achieve many goals using regular expressions.

 

* – matches 0 or more times

? – matches 0 or one times

+ – matches 1 or more times

[] – define character classes of one character [Bb]

() – group characters and to provide alternation (mail | db), group text

^ – anchor text at start of line

$ – anchor text at end of line

| – matches alternate words

. – match only one character

– escapes following character

{} – qualifier for max or min, max {1,6}

b. Regular Characters include: A-Z, a-z, 0-9 and “_”.

 

example 1.

tail me*.[1-3]

example 2.

ps aux | grep -E 10[1-9][1-9]

example 3.

ps aux | grep -E 10[1-9]{2}

ps aux | grep -E 10[1-9]{4}

example 4.

ls ?[[:digit:]][[:digit:]][[:digit:]]?

POSIX Character Classes. [:class:]

This is an alternate method of specifying a range of characters to match.

[:alnum:] matches alphabetic or numeric characters. This is equivalent to A-Za-z0-9.

[:alpha:] matches alphabetic characters. This is equivalent to A-Za-z.

[:blank:] matches a space or a tab.

[:cntrl:] matches control characters.

[:digit:] matches (decimal) digits. This is equivalent to 0-9.

[:graph:] (graphic printable characters). Matches characters in the range of ASCII 33 – 126. This is the same as [:print:], below, but excluding the space character.

[:lower:] matches lowercase alphabetic characters. This is equivalent to a-z.

[:print:] (printable characters). Matches characters in the range of ASCII 32 – 126. This is the same as [:graph:], above, but adding the space character.

[:space:] matches whitespace characters (space and horizontal tab).

[:upper:] matches uppercase alphabetic characters. This is equivalent to A-Z.

[:xdigit:] matches hexadecimal digits. This is equivalent to 0-9A-Fa-f.

Here document

It is a form of I/O redirction to feed a list of commands to interactive program or command such as ftp, usersadd, etc.

example:

#!/bin/bash

 echo -e “Enter username to add: c”

read var1

echo -e “Enter desired password: c”

read var2

useradd $var1

passwd $var1 <<EOF ###### Here document

$var2

$var2

EOF 

Neelesh Gurjar has written 122 articles

Leave a Reply