How To Write Shell Script
How To Write Shell Script
Following steps are required to write shell script: (1) Use any editor like vi or mcedit to write shell script. (2) After writing shell script set execute permission for your script as follows syntax: chmod permission your-script-name Examples:
$ chmod +x your-script-name $ chmod 755 your-script-name
Note: This will set read write execute(7) permission for owner, for group and other permission is read and execute only(5). (3) Execute your script as syntax: bash your-script-name sh your-script-name ./your-script-name Examples:
$ bash bar $ sh bar $ ./bar
NOTE In the last syntax ./ means current directory, But only . (dot) means execute given command file in current shell without starting the new copy of shell, The syntax for . (dot) command is as follows Syntax: . command-name Example:
$ . foo
Now you are ready to write first shell script that will print "Knowledge is Power" on screen. See the common vi command list , if you are new to vi.
$ vi first # # My first shell script # clear echo "Knowledge is Power"
After saving the above script, you can run the script as follows:
$ ./first
This will not run script since we have not set execute permission for our script first; to do this type command
$ chmod 755 first $ ./first
Variables in Shell
To process our data/information, data must be kept in computers RAM memory. RAM memory is divided into small locations, and each location had unique number called memory location/address, which is used to hold our data. Programmer can give a unique name to this memory location/address called memory variable or variable (Its a named storage location that may take different values, but only one at a time). In Linux (Shell), there are two types of variable: (1) System variables - Created and maintained by Linux itself. This type of variable defined in CAPITAL LETTERS. (2) User defined variables (UDV) - Created and maintained by user. This type of variable defined in lower letters. You can see system variables by giving command like $ set, some of the important System variables are: System Variable BASH=/bin/bash BASH_VERSION=1.14.7(1) COLUMNS=80 HOME=/home/vivek LINES=25 LOGNAME=students OSTYPE=Linux PATH=/usr/bin:/sbin:/bin:/usr/sbin PS1=[\u@\h \W]\$ PWD=/home/students/Common SHELL=/bin/bash USERNAME=vivek Meaning Our shell name Our shell version name No. of columns for our screen Our home directory No. of columns for our screen students Our logging name Our Os type Our path settings Our prompt settings Our current working directory Our shell name User name who is currently login to this PC
NOTE that Some of the above settings can be different in your PC/Linux environment. You can print any of the above variables contains as follows:
Exercise: 1) If you want to print your home directory location then you give command: a)$ echo $HOME
Rules for Naming variable name (Both UDV and System Variable)
(1) Variable name must begin with Alphanumeric character or underscore character (_), followed by one or more Alphanumeric character. For e.g. Valid shell variable are as follows HOME SYSTEM_VERSION vech no (2) Don't put spaces on either side of the equal sign when assigning value to variable. For e.g. In following variable declaration there will be no error
$ no=10
But there will be problem for any of the following variable declaration:
$ no =10 $ no= 10 $ no = 10
(3) Variables are case-sensitive, just like filename in Linux. For e.g.
$ no=10 $ No=11 $ NO=20
$ nO=2
Above all are different variable name, so to print value 20 we have to use $ echo $NO and not any of the following $ echo $no # will print 10 but not 20 $ echo $No# will print 11 but not 20 $ echo $nO# will print 2 but not 20 (4) You can define NULL variable as follows (NULL variable is variable which has no value at the time of definition) For e.g. $ vech= $ vech="" Try to print it's value by issuing following command
$ echo $vech
Nothing will be shown because variable has no value i.e. NULL variable. (5) Do not use ?,* etc, to name your variable names.
$x=20 $ y=5 $ expr x / y Q.5.Modify above and store division of x and y to variable called z For Ans. Click here $ x=20 $ y=5 $ z=`expr x / y` $ echo $z Q.6.Point out error if any in following script $ vi variscript # # # Script to test MY knolwdge about variables! # myname=Vivek myos = TroubleOS -----> ERROR 1 myno=5 echo "My name is $myname" echo "My os is $myos" echo "My number is myno, can you see this number" ----> ERROR 2
Shell Arithmetic
Use to perform arithmetic operations. Syntax: expr op1 math-operator op2 Examples:
$ $ $ $ $ $ expr expr expr expr expr echo 1 + 3 2 - 1 10 / 2 20 % 3 10 \* 3 `expr 6 + 3`
Note: expr 20 %3 - Remainder read as 20 mod 3 and remainder is 2. expr 10 \* 3 - Multiplication use \* and not * since its wild card. For the last statement not the following points
(1) First, before expr keyword we used ` (back quote) sign not the (single quote i.e. ') sign. Back quote is generally found on the key under tilde (~) on PC keyboard OR to the above of TAB key. (2) Second, expr is also end with ` i.e. back quote. (3) Here expr 6 + 3 is evaluated to 9, then echo command prints 9 as sum (4) Here if you use double quote or single quote, it will NOT work For e.g. $ echo "expr 6 + 3" # It will print expr 6 + 3 $ echo 'expr 6 + 3' # It will print expr 6 + 3
Run it as follows:
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 date and who command.
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". Exercise Try to write following for commands Shell Script Name ($0), No. of Arguments (i.e. $#), And actual argument (i.e. $1,$2 etc)
$ $ $ $ $ $ $ sum 11 20 math 4 - 7 d bp -5 myf +20 Ls * cal findBS 4 8 24 BIG
Answer
24
BIG
Following script is used to print command ling argument and will show you how to access them:
$ vi demo #!/bin/sh # # Script that demos, command line args #
"Total number of command line argument are $#" "$0 is script name" "$1 is first argument" "$2 is second argument" "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
Exit Status
By default in Linux if particular command/shell script is executed, it return two type of values which is used to see whether command or shell script executed is successful or not. (1) If return value is zero (0), command is successful. (2) If return value is nonzero, command is not successful or some sort of error executing command/shell script. This value is know as Exit Status. But how to find out exit status of command or shell script? Simple, to determine this exit Status you can use $? special variable of shell. For e.g. (This example assumes that unknow1file doest not exist on your hard drive) $ rm unknow1file It will show error as follows rm: cannot remove `unkowm1file': No such file or directory and after that if you give command $ echo $? it will print nonzero value to indicate error. Now give command $ ls
$ echo $? It will print 0 to indicate command is successful. Exercise Try the following commands and not down the exit status:
$ expr 1 + 3 $ echo $? $ echo Welcome $ echo $? $ wildwest canwork? $ echo $? $ date $ echo $? $ echon $? $ echo $?
Following script is used to print command ling argument and will show you how to access them:
$ 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"
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
How to write shell script that will add two nos, which are supplied as command line argument, and if this two nos are not given show error and its usage
# # Q1.Script to sum to nos # if [ $# -ne 2 ] then echo "Usage - $0 x y" echo " Where x and y are two nos for which I will print sum" exit 1 fi echo "Sum of $1 and $2 is `expr $1 + $2`"
1) START: set value of i to want to start from other 2) Start While Loop 3) Chechk, Is value of i is continue with next step 4) print i, decement i by 1 goto step 3 5) END
5 (since we want to start from 5, if you value put that value) zero, If yes goto step 5 else (i.e. i=i-1 to goto zero) and
Write Script, using case statement to perform basic math operation as follows + addition - subtraction x multiplication / division The name of script must be 'q4' which works as follows $ ./q4 20 / 3, Also check for sufficient command line arguments
if test $# = 3 then case $2 in +) let z=$1+$3;; -) let z=$1-$3;; /) let z=$1/$3;; x|X) let z=$1*$3;; *) echo Warning - $2 invalied operator, only +,-,x,/ operator allowed exit;; esac echo Answer is $z else echo "Usage - $0 value1 operator value2" echo " Where, value1 and value2 are numeric values" echo " operator can be +,-,/,x (For Multiplication)" fi
Write Script to see current date, time, username, and current directory
"Hello, $LOGNAME" "Current date is `date`" "User is `who i am`" "Current direcotry `pwd`"
Write script to print given number in reverse order, for eg. If no is 123 it must print as 321. Script to reverse given no # # Algo: # 1) Input number n
# 2) Set rev=0, sd=0 # 3) Find single digit in sd as n % 10 it will give (left most digit) # 4) Construct revrse no as rev * 10 + sd # 5) Decrment n by 1 # 6) Is n is greater than zero, if yes goto step 3, otherwise next step # 7) Print rev # if [ $# -ne 1 ] then echo "Usage: $0 number" echo " I will find reverse of given number" echo " For eg. $0 123, I will print 321" exit 1 fi n=$1 rev=0 sd=0 while [ $n -gt 0 ] do sd=`expr $n % 10` rev=`expr $rev \* 10 + $sd` n=`expr $n / 10` done echo "Reverse number is $rev" Write script to print given numbers sum of all digit, For eg. If no is 123 it's sum of all digit will be 1+2+3 = 6 Algo: # 1) Input number n # 2) Set sum=0, sd=0 # 3) Find single digit in sd as n % 10 it will give (left most digit) # 4) Construct sum no as sum=sum+sd # 5) Decrment n by 1 # 6) Is n is greater than zero, if yes goto step 3, otherwise next step # 7) Print sum # if [ $# -ne 1 ] then echo "Usage: $0 number" echo " I will find sum of all digit for given number" echo " For eg. $0 123, I will print 6 as sum of all digit (1+2+3)" exit 1 fi n=$1 sum=0 sd=0 while [ $n -gt 0 ] do sd=`expr $n % 10` sum=`expr $sum + $sd` n=`expr $n / 10` done echo "Sum of digit for numner is $sum"