unix scripting

33
Where I can use Linux? You can use Linux as Server Os or as standalone Os on your PC. (But it is best suited for Server.) As a server Os it provides different services/network resources to client. Server Os must be: Stable Robust Secure High Performance Linux offers all of the above characteristics plus its Open Source and Free OS. So Linux can be used as: (1) On standalone workstation/PC for word processing, graphics, software development, internet, e-mail, chatting, small personal database management system etc. (2) In network environment as: (A) File and Print or Application Server Share the data, Connect the expensive device like printer and share it, e-mail within the LAN/intranet etc are some of the application. Linux Server with different Client Os (B) Linux sever cab be connected to Internet, So that PC's on intranet can share the internet/e- mail etc. You can put your web server that run your web site or transmit the information on the internet.

Upload: linhanuma

Post on 18-Nov-2014

670 views

Category:

Documents


2 download

DESCRIPTION

unix

TRANSCRIPT

Page 1: unix scripting

Where I can use Linux? You can use Linux as Server Os or as standalone Os on your PC. (But it is best suited for Server.) As a server Os it provides different services/network resources to client. Server Os must be:

• Stable • Robust • Secure • High Performance

Linux offers all of the above characteristics plus its Open Source and Free OS. So Linux can be used as:

(1) On standalone workstation/PC for word processing, graphics, software development, internet, e-mail, chatting, small personal database management system etc. (2) In network environment as: (A) File and Print or Application Server Share the data, Connect the expensive device like printer and share it, e-mail within the LAN/intranet etc are some of the application.

Linux Server with different Client Os

(B) Linux sever cab be connected to Internet, So that PC's on intranet can share the internet/e-mail etc. You can put your web server that run your web site or transmit the information on the internet.

Page 2: unix scripting

Linux Server can act as Proxy/Mail/WWW/Router Server etc.

So you can use Linux for:

• Personal Work • Web Server • Software Development Workstation • Workgroup Server • In Data Center for various server activities such as FTP, Telnet, SSH, Web, Mail, Proxy,

Proxy Cache Appliance etc

Page 3: unix scripting

What Kernel Is? Kernel is heart of Linux Os.

It manages resource of Linux Os .Resources means facilities available in Linux. For e.g. Facility to store data, print data on printer, memory, file management etc.

Kernel decides who will use this resource, for how long and when. It runs your programs (or set up to execute binary files).

The kernel acts as an intermediary between the computer hardware and various programs/application/shell.

It's Memory resident portion of Linux. It performance following tasks:-

• I/O management • Process management • Device management • File management • Memory management

Page 4: unix scripting

What is Linux Shell ? Computer understands the language of 0's and 1's called binary language.

In early days of computing, instruction are provided using binary language, which is difficult for all of us, to read and write. So in Os there is special program called Shell. Shell accepts your instruction or commands in English (mostly) and if it is a valid command, it is passed to kernel.

Shell is a user program or it is environment provided for user interaction. Shell is a command language interpreter that executes commands read from the standard input device (keyboard) or from a file.

Shell is not part of system kernel, but uses the system kernel to execute programs, create files etc.

Several shells available with Linux including:

Shell Name Developed by Where Remark BASH ( Bourne-Again SHell )

Brian Fox and Chet Ramey

Free Software Foundation

Most common shell in Linux. It's Freeware shell.

CSH (C SHell) Bill Joy University of California (For BSD)

The C shell's syntax and usage are very similar to the C programming language.

KSH (Korn SHell) David Korn AT & T Bell Labs -- TCSH See the man page.

Type $ man tcsh -- TCSH is an enhanced

but completely compatible version of the Berkeley UNIX C shell (CSH).

Tip: To find all available shells in your system type following command: $ cat /etc/shells

Note that each shell does the same job, but each understand different command syntax and provides different built-in functions.

In MS-DOS, Shell name is COMMAND.COM which is also used for same purpose, but it's not as powerful as our Linux Shells are!

Any of the above shell reads command from user (via Keyboard or Mouse) and tells Linux Os what users want. If we are giving commands from keyboard it is called command line interface (

Page 5: unix scripting

Usually in-front of $ prompt, This prompt is depend upon your shell and Environment that you set or by your System Administrator, therefore you may get different prompt ).

Tip: To find your current shell type following command $ echo $SHELL

Page 6: unix scripting

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 $?

Page 7: unix scripting

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"

Page 8: unix scripting

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

First screen will be clear, then Knowledge is Power is printed on screen.

Script Command(s) Meaning $ vi first Start vi editor

# # My first shell script #

# followed by any text is considered as comment. Comment gives more information about script, logical explanation about shell script. Syntax: # comment-text

clear clear the screen

echo "Knowledge is Power"

To print message or value of variables on screen, we use echo command, general form of echo command is as follows syntax: echo "Message"

How Shell Locates the file (My own bin directory to execute script)

Tip: For shell script file try to give file extension such as .sh, which can be easily identified by you as shell script.

Exercise: 1)Write following shell script, save it, execute it and note down the it's output.

$ vi ginfo # # # Script to print user information who currently login , current date & time # clear echo "Hello $USER" echo "Today is \c ";date echo "Number of user login : \c" ; who | wc -l echo "Calendar" cal exit 0

Page 9: unix scripting

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 Meaning BASH=/bin/bash Our shell name BASH_VERSION=1.14.7(1) Our shell version name COLUMNS=80 No. of columns for our screen HOME=/home/vivek Our home directory LINES=25 No. of columns for our screen LOGNAME=students students Our logging name OSTYPE=Linux Our Os type PATH=/usr/bin:/sbin:/bin:/usr/sbin Our path settings PS1=[\u@\h \W]\$ Our prompt settings PWD=/home/students/Common Our current working directory SHELL=/bin/bash Our shell name USERNAME=vivek 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: $ echo $USERNAME $ echo $HOME

Exercise: 1) If you want to print your home directory location then you give command: a)$ echo $HOME

OR

Page 10: unix scripting

(b)$ echo HOME

Which of the above command is correct & why? Click here for answer.

Answer to Variables in Linux.

1) If you want to print your home directory location then you give command: (a) $ echo $HOME

or

(b) $ echo HOME

Which of the above command is correct & why?

Ans.: (a) command is correct, since we have to print the contains of variable (HOME) and not the HOME. You must use $ followed by variable name to print variables cotaines.

Page 11: unix scripting

How to define User defined variables (UDV) To define UDV use following syntax Syntax: variable name=value

'value' is assigned to given 'variable name' and Value must be on right side = sign. Example: $ no=10# this is ok $ 10=no# Error, NOT Ok, Value must be on right side of = sign. To define variable called 'vech' having value Bus $ vech=Bus To define variable called n having value 10 $ n=10

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

Page 12: unix scripting

(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.

How to print or access value of UDV (User defined variables) To print or access UDV use following syntax Syntax: $variablename

Define variable vech and n as follows: $ vech=Bus $ n=10 To print contains of variable 'vech' type $ echo $vech It will print 'Bus',To print contains of variable 'n' type command as follows $ echo $n

Caution: Do not try $ echo vech, as it will print vech instead its value 'Bus' and $ echo n, as it will print n instead its value '10', You must use $ followed by variable name.

Exercise Q.1.How to Define variable x with value 10 and print it on screen. Q.2.How to Define variable xn with value Rani and print it on screen Q.3.How to print sum of two numbers, let's say 6 and 3? Q.4.How to define two variable x=20, y=5 and then to print division of x and y (i.e. x/y) Q.5.Modify above and store division of x and y to variable called z Q.6.Point out error if any in following script

$ vi variscript # # # Script to test MY knowledge about variables! # myname=Vivek myos = TroubleOS myno=5 echo "My name is $myname" echo "My os is $myos" echo "My number is myno, can you see this number"

Page 13: unix scripting

For Answers Click here

Answer to Variable sections exercise

Q.1.How to Define variable x with value 10 and print it on screen. $ x=10 $ echo $x Q.2.How to Define variable xn with value Rani and print it on screen For Ans. Click here $ xn=Rani $ echo $xn Q.3.How to print sum of two numbers, let's say 6 and 3 $ echo 6 + 3 This will print 6 + 3, not the sum 9, To do sum or math operations in shell use expr, syntax is as follows Syntax: expr op1 operator op2 Where, op1 and op2 are any Integer Number (Number without decimal point) and operator can be + Addition - Subtraction / Division % Modular, to find remainder For e.g. 20 / 3 = 6 , to find remainder 20 % 3 = 2, (Remember its integer calculation) \* Multiplication $ expr 6 + 3 Now It will print sum as 9 , But $ expr 6+3 will not work because space is required between number and operator (See Shell Arithmetic) Q.4.How to define two variable x=20, y=5 and then to print division of x and y (i.e. x/y) For Ans. Click here $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

Page 14: unix scripting

$ 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

ERROR 1 Read this

ERROR 2 Read this

Following script should work now, after bug fix!

$ vi variscript # # # Script to test MY knolwdge about variables! # myname=Vivek myos=TroubleOS myno=5 echo "My name is $myname" echo "My os is $myos" echo "My number is $myno, can you see this number"

echo Command Use echo command to display text or value of variable.

echo [options] [string, variables...] Displays text or variables value on screen. Options -n Do not output the trailing new line. -e Enable interpretation of the following backslash escaped characters in the strings: \a alert (bell) \b backspace \c suppress trailing new line \n new line \r carriage return

Page 15: unix scripting

\t horizontal tab \\ backslash

For e.g. $ echo -e "An apple a day keeps away \a\t\tdoctor\n"

How to display colorful text on screen with bold or blink effects, how to print text on any row, column on screen, click here for more!

Linux Console (Screen)

How can I write colorful message on Linux Console? , mostly this kind of question is asked by newcomers (Specially those who are learning shell programming!). As you know in Linux everything is considered as a file, our console is one of such special file. You can write special character sequences to console, which control every aspects of the console like Colors on screen, Bold or Blinking text effects, clearing the screen, showing text boxes etc. For this purpose we have to use special code called escape sequence code. Our Linux console is based on the DEC VT100 serial terminals which support ANSI escape sequence code.

What is special character sequence and how to write it to Console?

By default what ever you send to console it is printed as its. For e.g. consider following echo statement, $ echo "Hello World" Hello World Above echo statement prints sequence of character on screen, but if there is any special escape sequence (control character) in sequence , then first some action is taken according to escape sequence (or control character) and then normal character is printed on console. For e.g. following echo command prints message in Blue color on console $ echo -e "\033[34m Hello Colorful World!" Hello Colorful World! Above echo statement uses ANSI escape sequence (\033[34m), above entire string ( i.e. "\033[34m Hello Colorful World!" ) is process as follows

1) First \033, is escape character, which causes to take some action 2) Here it set screen foreground color to Blue using [34m escape code. 3) Then it prints our normal message Hello Colorful World! in blue color.

Note that ANSI escape sequence begins with \033 (Octal value) which is represented as ^[ in termcap and terminfo files of terminals and documentation.

You can use echo statement to print message, to use ANSI escape sequence you must use -e option (switch) with echo statement, general syntax is as follows Syntax echo -e "\033[escape-code your-message"

Page 16: unix scripting

In above syntax you have to use\033[ as its with different escape-code for different operations. As soon as console receives the message it start to process/read it, and if it found escape character (\033) it moves to escape mode, then it read "[" character and moves into Command Sequence Introduction (CSI) mode. In CSI mode console reads a series of ASCII-coded decimal numbers (know as parameter) which are separated by semicolon (;) . This numbers are read until console action letter or character is not found (which determines what action to take). In above example

\033 Escape character [ Start of CSI 34 34 is parameter m m is letter (specifies action)

Following table show important list of such escape-code/action letter or character

Character or letter Use in CSI Examples h Set the ANSI mode echo -e "\033[h" l Clears the ANSI mode echo -e "\033[l"

m

Useful to show characters in different colors or effects such as BOLD and Blink, see below for parameter taken by m.

echo -e "\033[35m Hello World"

q Turns keyboard num lock, caps lock, scroll lock LED on or off, see below.

echo -e "\033[2q"

s Stores the current cursor x,y position (col , row position) and attributes

echo -e "\033[7s"

u Restores cursor position and attributes echo -e "\033[8u"

m understand following parameters

Parameter Meaning Example

0

Sets default color scheme (White foreground and Black background), normal intensity, no blinking etc.

1 Set BOLD intensity

$ echo -e "I am \033[1m BOLD \033[0m Person" I am BOLD Person Prints BOLD word in bold intensity and next ANSI Sequence remove bold effect (\033[0m)

Page 17: unix scripting

2 Set dim intensity $ echo -e "\033[1m BOLD \033[2m DIM \033[0m"

5 Blink Effect $ echo -e "\033[5m Flash! \033[0m"

7

Reverse video effect i.e. Black foreground and white background in default color scheme

$ echo -e "\033[7m Linux OS! Best OS!! \033[0m"

11

Shows special control character as graphics character. For e.g. Before issuing this command press alt key (hold down it) from numeric key pad press 178 and leave both key; nothing will be printed. Now give --> command shown in example and try the above, it works. (Hey you must know extended ASCII Character for this!!!)

$ press alt + 178 $ echo -e "\033[11m" $ press alt + 178 $ echo -e "\033[0m" $ press alt + 178

25 Removes/disables blink effect

27 Removes/disables reverse effect

30 - 37

Set foreground color 31 - RED 32 - Green xx - Try to find yourself this left as exercise for you :-)

$ echo -e "\033[31m I am in Red"

40 - 47 Set background color xx - Try to find yourself this left as exercise for you :-)

$ echo -e "\033[44m Wow!!!"

q understand following parameters

Parameters Meaning 0 Turns off all LEDs on Keyboard 1 Scroll lock LED on and others off 2 Num lock LED on and others off 3 Caps lock LED on and others off

Shell Arithmetic

Page 18: unix scripting

Use to perform arithmetic operations.

Syntax: expr op1 math-operator op2 Examples: $ expr 1 + 3 $ expr 2 - 1 $ expr 10 / 2 $ expr 20 % 3 $ expr 10 \* 3 $ echo `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

More about Quotes There are three types of quotes

Quotes Name Meaning

" Double Quotes

"Double Quotes" - Anything enclose in double quotes removed meaning of that characters (except \ and $).

' Single quotes 'Single quotes' - Enclosed in single quotes remains unchanged.

` Back quote `Back quote` - To execute command

Example: $ echo "Today is date"

Page 19: unix scripting

Can't print message with today's date. $ echo "Today is `date`". It will print today's date as, Today is Tue Jan ....,Can you see that the `date` statement uses back quote?

The read Statement Use to get input (data from user) from keyboard and store (data) to variable. Syntax: read variable1, variable2,...variableN

Following script first ask user, name and 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) and entered name through keyboard is stored (assigned) to variable fname.

$ 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!

Wild cards (Filename Shorthand or meta Characters)

Wild card /Shorthand Meaning Examples

* Matches any string or group of characters.

$ ls * will show all files

$ ls a* will show all files whose first name is starting with letter 'a'

$ ls *.c will show all files having extension .c

$ ls ut*.c will show all files

Page 20: unix scripting

having extension .c but file name must begin with 'ut'.

? Matches any single character.

$ ls ? will show all files whose names are 1 character long

$ ls fo?

will show all files whose names are 3 character long and file name begin with fo

[...] Matches any one of the enclosed characters $ ls [abc]*

will show all files beginning with letters a,b,c

Note: [..-..] A pair of characters separated by a minus sign denotes a range.

Example: $ ls /bin/[a-c]*

Will show all files name beginning with letter a,b or c like

/bin/arch /bin/awk /bin/bsh /bin/chmod /bin/cp /bin/ash /bin/basename /bin/cat /bin/chown /bin/cpio /bin/ash.static /bin/bash /bin/chgrp /bin/consolechars /bin/csh

But $ ls /bin/[!a-o] $ ls /bin/[^a-o]

If the first character following the [ is a ! or a ^ ,then any character not enclosed is matched i.e. do not show us file name that beginning with a,b,c,e...o, like

/bin/ps /bin/rvi /bin/sleep /bin/touch /bin/view /bin/pwd /bin/rview /bin/sort /bin/true /bin/wcomp /bin/red /bin/sayHello /bin/stty /bin/umount /bin/xconf /bin/remadmin /bin/sed /bin/su /bin/uname /bin/ypdomainname /bin/rm /bin/setserial /bin/sync /bin/userconf /bin/zcat /bin/rmdir /bin/sfxload /bin/tar /bin/usleep /bin/rpm /bin/sh /bin/tcsh /bin/vi

Page 21: unix scripting

More command on one command line Syntax: command1;command2 To run two command with 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 date and who command.

Command Line Processing Try the following command (assumes that the file "grate_stories_of" is not exist on your system) $ ls grate_stories_of It will print message something like - grate_stories_of: No such file or directory.

ls is the name of an actual command and shell executed this command when you type command at shell prompt. Now it creates one more question What are commands? What happened when you type $ ls grate_stories_of ?

The first word on command line is, ls - is name of the command to be executed. Everything else on command line is taken as arguments to this command. For e.g. $ tail +10 myf Name of command is tail, and the arguments are +10 and myf.

Exercise Try to determine command and arguments from following commands $ ls foo $ cp y y.bak $ mv y.bak y.okay $ tail -10 myf $ mail raj $ sort -r -n myf $ date $ clear

Answer:

Command No. of argument to this command (i.e $#) Actual Argument

ls 1 foo cp 2 y and y.bak

Page 22: unix scripting

mv 2 y.bak and y.okay tail 2 -10 and myf mail 1 raj sort 3 -r, -n, and myf date 0 clear 0

NOTE: $# holds number of arguments specified on command line. And $* or $@ refer to all arguments passed to script.

Why Command Line arguments required 1. Telling the command/utility which option to use. 2. Informing the utility/command which file or group of files to process (reading/writing of

files).

Let's take rm command, which is used to remove file, but which file you want to remove and how you will tail this to rm command (even rm command don't ask you name of file that you would like to remove). So what we do is we write command as follows: $ rm {file-name} Here rm is command and filename is file which you would like to remove. This way you tail rm command which file you would like to remove. So we are doing one way communication with our command by specifying filename Also you can pass command line arguments to your script to make it more users friendly. But how we access command line argument in our script.

Lets take ls command $ Ls -a /* This command has 2 command line argument -a and /* is another. For shell script, $ 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

Page 23: unix scripting

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

Shell Script Name No. Of Arguments to script Actual Argument ($1,..$9) $0 $# $1 $2 $3 $4 $5

sum 2 11 20 math 3 4 - 7 d 0 bp 3 -5 myf +20 Ls 1 * cal 0 findBS 4 4 8 24 BIG

Following script is used to print command ling argument and will show you how to access them:

$ vi demo #!/bin/sh

Page 24: unix scripting

# # 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

NOTE: After this, for any script you have to used above command, in sequence, I am not going to show you all of the above command(s) for rest of Tutorial.

Also note that you can't assigne the new value to command line arguments i.e positional parameters. So following all statements in shell script are invalid: $1 = 5 $2 = "My Name"

Redirection of Standard output/input i.e. Input - Output redirection Mostly all command gives output on screen or take input from keyboard, but in Linux (and in other OSs also) it's possible to send output to file or to read input from 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.

There are three main redirection symbols >,>>,<

Page 25: unix scripting

(1) > Redirector Symbol Syntax: Linux-command > filename To output Linux-commands result (output of command or shell script) to file. Note that if file already exist, it will be overwritten else new file is created. For e.g. To send output of ls command give $ ls > myfiles Now if 'myfiles' file exist in your current directory it will be overwritten without any type of warning.

(2) >> Redirector Symbol Syntax: Linux-command >> filename To output Linux-commands result (output of command or shell script) to END of file. Note that if file exist , it will be opened and new information/data will be written to END of file, without losing previous information/data, And if file is not exist, then new file is created. For e.g. To send output of date command to already exist file give command $ date >> myfiles

(3) < Redirector Symbol Syntax: Linux-command < filename To take input to Linux-command from file instead of key-board. For e.g. To take input for cat command give $ cat < myfiles

Click here to learn more about I/O Redirection

You can also use above redirectors simultaneously as follows Create text file sname as follows

$cat > sname vivek ashish zebra babu Press CTRL + D to save.

Now issue following command. $ sort < sname > sorted_names $ cat sorted_names ashish babu vivek zebra

Page 26: unix scripting

In above example sort ($ sort < sname > sorted_names) command takes input from sname file and output of sort command (i.e. sorted names) is redirected to sorted_names file.

Try one more example to clear your idea: $ tr "[a-z]" "[A-Z]" < sname > cap_names $ cat cap_names VIVEK ASHISH ZEBRA BABU

tr command is used to translate all lower case characters to upper-case letters. It take input from sname file, and tr's output is redirected to cap_names file.

Future Point : Try following command and find out most important point: $ sort > new_sorted_names < sname $ cat new_sorted_names

I/O Redirection and file descriptors As you know I/O redirectors are used to send output of command to file or to read input from file. Consider following example $ cat > myf This is my file ^D (press CTRL + D to save file) Above command send output of cat command to myf file $ cal Above command prints calendar on screen, but if you wish to store this calendar to file then give command $ cal > mycal The cal command send output to mycal file. This is called output redirection. $ sort 10 -20 11 2 ^D -20 2 10 11 sort command takes input from keyboard and then sorts the number and prints (send) output to screen itself. If you wish to take input from file (for sort command) give command as follows: $ cat > nos

Page 27: unix scripting

10 -20 11 2 ^D $ sort < nos -20 2 10 11 First you created the file nos using cat command, then nos file given as input to sort command which prints sorted numbers. This is called input redirection. In Linux (And in C programming Language) your keyboard, screen etc are all treated as files. Following are name of such files

Standard File File Descriptors number Use Example

stdin 0 as Standard input Keyboard

stdout 1 as Standard output Screen

stderr 2 as Standard error Screen

By default in Linux every program has three files associated with it, (when we start our program these three files are automatically opened by your shell). The use of first two files (i.e. stdin and stdout) , are already seen by us. The last file stderr (numbered as 2) is used by our program to print error on screen. You can redirect the output from a file descriptor directly to file with following syntax Syntax: file-descriptor-number>filename

Examples: (Assemums the file bad_file_name111 does not exists) $ rm bad_file_name111 rm: cannot remove `bad_file_name111': No such file or directory Above command gives error as output, since you don't have file. Now if we try to redirect this error-output to file, it can not be send (redirect) to file, try as follows: $ rm bad_file_name111 > er Still it prints output on stderr as rm: cannot remove `bad_file_name111': No such file or directory, And if you see er file as $ cat er , this file is empty, since output is send to error device and you can not redirect it to copy this error-output to your file 'er'. To overcome this problem you have to use following command: $ rm bad_file_name111 2>er Note that no space are allowed between 2 and >, The 2>er directs the standard error output to file. 2 number is default number (file descriptors number) of stderr file. To clear your idea onsider another example by writing shell script as follows:

Page 28: unix scripting

$ cat > demoscr if [ $# -ne 2 ] then echo "Error : Number are not supplied" echo "Usage : $0 number1 number2" exit 1 fi ans=`expr $1 + $2` echo "Sum is $ans"

Run it as follows: $ chmod 755 demoscr $ ./demoscr Error : Number are not supplied Usage : ./demoscr number1 number2 $ ./demoscr > er1 $ ./demoscr 5 7 Sum is 12

For first sample run , our script prints error message indicating that you have not given two number.

For second sample run, you have redirect output of script to file er1, since it's error we have to show it to user, It means we have to print our error message on stderr not on stdout. To overcome this problem replace above echo statements as follows echo "Error : Number are not supplied" 1>&2 echo "Usage : $0 number1 number2" 1>&2 Now if you run it as follows: $ ./demoscr > er1 Error : Number are not supplied Usage : ./demoscr number1 number2

It will print error message on stderr and not on stdout. The 1>&2 at the end of echo statement, directs the standard output (stdout) to standard error (stderr) device. Syntax: from>&destination

Pipes A pipe is a way to connect the output of one program to the input of another program without any temporary file.

Page 29: unix scripting

Pipe Defined as: "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

Examles:

Command using Pipes Meaning or Use of Pipes

$ ls | more Output of ls command is given as input to more command So that output is printed one screen full page at a time.

$ who | sort Output of who command is given as input to sort command So that it will print sorted list of users

$ who | sort > user_list Same as above except output of sort is send to (redirected) user_list file

$ who | wc -l Output of who command is given as input to wc command So that it will number of user who logon to system

$ ls -l | wc -l Output of ls command is given as input to wc command So that it will print number of files in current directory.

$ who | grep raju

Output of who command is given as input to grep command So that it will print if particular user name if he is logon or nothing is printed (To see particular user is logon or not)

Page 30: unix scripting

Filter If a Linux command accepts its input from the standard input and produces its output on standard output is know as a filter. A filter performs some kind of process on the input and gives output. For e.g.. Suppose you have file called 'hotel.txt' with 100 lines data, And from 'hotel.txt' you would like to print contains from line number 20 to line number 30 and store this result to file called 'hlist' then give command: $ tail +20 < hotel.txt | head -n30 >hlist

Here head command is filter which takes its input from tail command (tail command start selecting from line number 20 of given file i.e. hotel.txt) and passes this lines as input to head, whose output is redirected to 'hlist' file.

Consider one more following example $ sort < sname | uniq > u_sname

Here uniq is filter which takes its input from sort command and passes this lines as input to uniq; Then uniqs output is redirected to "u_sname" file.

What is Processes Process is kind of program or task carried out by your PC. For e.g. $ ls -lR ls command or a request to list files in a directory and all subdirectory in your current directory - It is a process.

Process defined as: "A process is program (command given by user) to perform specific Job. In Linux when you start process, it gives a number to process (called PID or process-id), PID starts from 0 to 65535."

Why Process required As You know Linux is multi-user, multitasking Os. It means you can run more than two process simultaneously if you wish. For e.g. To find how many files do you have on your system you may give command like: $ ls / -R | wc -l This command will take lot of time to search all files on your system. So you can run such command in Background or simultaneously by giving command like $ ls / -R | wc -l & The ampersand (&) at the end of command tells shells start process (ls / -R | wc -l) and run it in background takes next command immediately.

Page 31: unix scripting

Process & PID defined as: "An instance of running command is called process and the number printed by shell is called process-id (PID), this PID can be use to refer specific running process."

Linux Command Related with Process Following tables most commonly used command(s) with process:

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 {Process-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 particular command and program in background)

linux-command & $ ls / -R | wc -l &

To display the owner of the processes along with the processes

ps aux $ ps aux

To see if a particular process is running or not. For this purpose you have to use ps command in combination with the grep command

ps ax | grep process-U-want-to see

For e.g. you want to see whether Apache web server process is running or not then give command

$ ps ax | grep httpd

To see currently running processes and other information like memory and CPU usage with real time updates.

top See the output of top command.

$ top Note that to exit from top command press q.

To display a tree of processes pstree $ pstree

* To run some of this command you need to be root or equivalnt user.

NOTE that you can only kill process which are created by yourself. A Administrator can almost kill 95-98% process. But some process can not be killed, such as VDU Process.

Page 32: unix scripting

Exercise: You are working on your Linux workstation (might be learning LSST or some other work like sending mails, typing letter), while doing this work you have started to play MP3 files on your workstation. Regarding this situation, answer the following question:

1) Is it example of Multitasking? 2) How you will you find out the both running process (MP3 Playing & Letter typing)? 3) "Currently only two Process are running in your Linux/PC environment", Is it True or False?, And how you will verify this? 4) You don't want to listen music (MP3 Files) but want to continue with other work on PC, you will take any of the following action:

1. Turn off Speakers 2. Turn off Computer / Shutdown Linux Os 3. Kill the MP3 playing process 4. None of the above

Click here for answers.

Answer to Process Section.

1) Is it example of Multitasking? Ans.: Yes, since you are running two process simultaneously.

2) How you will you find out the both running process (MP3 Playing & Letter typing)? Ans.: Try $ ps aux or $ ps ax | grep process-you-want-to-search

3) "Currently only two Process are running in your Linux/PC environment", Is it True or False?, And how you will verify this? Ans.: No its not true, when you start Linux Os, various process start in background for different purpose. To verify this simply use top or ps aux command.

4) You don't want to listen music (MP3 Files) but want to continue with other work on PC, you will take any of the following action:

1. Turn off Speakers 2. Turn off Computer / Shutdown Linux Os 3. Kill the MP3 playing process 4. None of the above

Ans.: Use action no. 3 i.e. kill the MP3 process. Tip: First find the PID of MP3 playing process by issuing command: $ ps ax | grep mp3-process-name Then in the first column you will get PID of process. Kill this PID to end the process as: $ kill PID

Page 33: unix scripting

Or you can try killall command to kill process by name as follows: $ killall mp3-process-name