ult/Section_5.rst
author amit@thunder
Mon, 12 Jul 2010 15:39:29 +0530
changeset 100 344a1d6f1e64
parent 91 6f2f2f949e32
permissions -rw-r--r--
Changes to shell scripting
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     1
tar:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     2
====
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     3
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     4
Introduction:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     5
-------------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     6
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     7
In world of Linux based distribution, *tarballs* is the term which pops up very often. It is part of the GNU project and comes as part of every distribution of GNU/Linux. Tarball is like defacto standard for releasing source code for free software. Some of common use of *tar* archives is to: *Store, backup, and transport*.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     8
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
     9
GNU tar creates and manipulates archives which are actually collections of many other files; the program provides users with an organized and systematic method for controlling a large amount of data. It is basically form of creating archive by concatenating one or more files. 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    10
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
    11
Getting Started:
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    12
---------------------------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    13
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    14
As mentioned previously and if not, *The best way to get started with any command line tool of Linux is to use "man".* ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    15
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    16
   $ man tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    17
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    18
or try these commands(the output may vary with different installations): ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    19
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    20
   $ tar --version
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    21
   tar (GNU tar) 1.20
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    22
   Copyright (C) 2008 Free Software Foundation, Inc.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    23
   License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    24
   This is free software: you are free to change and redistribute it.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    25
   There is NO WARRANTY, to the extent permitted by law.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    26
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    27
   Written by John Gilmore and Jay Fenlason.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    28
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    29
   $ tar --help
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    30
   Usage: tar [OPTION...] [FILE]...
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    31
   GNU `tar' saves many files together into a single tape or disk archive, and can
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    32
   restore individual files from the archive.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    33
   Examples:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    34
   tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    35
   tar -tvf archive.tar         # List all files in archive.tar verbosely.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    36
   tar -xf archive.tar          # Extract all files from archive.tar.  
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    37
   ____________
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    38
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    39
Creating a tar archive: 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    40
~~~~~~~~~~~~~~~~~~~~~~~
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    41
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    42
We will do some off-the road activity for this exercise. We will use an interesting command *fortune* for creating our practice files and then performing archives of those files and directories. Content of the files would vary for users, as fortune works like that. ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    43
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    44
   $ mkdir fortune-files 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    45
   $ cd fortune-files/
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    46
   $ fortune > first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    47
   $ cat first.txt 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    48
   Expect the worst, it's the least you can do.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    49
   $ fortune > second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    50
   $ fortune > third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    51
   $ ls
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    52
   first.txt  second.txt  third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    53
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    54
By now we have three txt files, with some random fortune content. To create a tar archive of these files we can use any of following commands according to ones convenience: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    55
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    56
   $ tar --create --verbose --file=allfiles.tar first.txt second.txt third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    57
   first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    58
   second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    59
   third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    60
   $ ls
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    61
   allfiles.tar  first.txt  second.txt  third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    62
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    63
allfiles.tar is our required tar archive of all the rest of files(or archive of files mentioned in command line). Other form of the previous command are: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    64
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    65
   $ tar -c -v -f allfiles.tar first.txt second.txt third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    66
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    67
or ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    68
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    69
   $ tar -cvf allfiles.tar first.txt second.txt third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    70
   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    71
The general format for creating a tar archive is: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    72
   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    73
   tar [OPTION...] [FILE]... 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    74
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    75
For our command are using these options:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    76
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    77
   * -c to Create the archive.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    78
   * -v for Verbose mode, to get the names of the files as they are archived.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    79
   * -f mentioning the file name of the resulting tar archive.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    80
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    81
To create archive of folder itself try this: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    82
   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    83
   $ tar -cvf fortune.tar fortune/
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    84
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    85
To add files to existing tar archive, option *`r`* is used: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    86
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    87
   $ fortune > fourth.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    88
   $ tar -r fourth.txt -vf allfiles.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    89
   fourth.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    90
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    91
There are other options too available for explicitly mentioning the position of archive, use *tar --help* for getting all the details.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    92
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    93
Similarly to remove file from archive use *--delete* option: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    94
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    95
   $ tar --delete second.txt -f allfiles.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    96
   $ tar -tf allfiles.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    97
   first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    98
   third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
    99
   fourth.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   100
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   101
Listing the files of archive:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   102
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   103
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   104
Once files are archived, tar command have the *`t`* option, for Listing all files in the tar file: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   105
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   106
   $ tar tf allfiles.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   107
   first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   108
   second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   109
   third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   110
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   111
**//this is not working for me in some cases :(**
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   112
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   113
To locate a particular file among the archive mention its name after *t* option. ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   114
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   115
   $ tar t second.txt allfiles.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   116
   second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   117
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   118
one can also use elementary regex for locating the file, so in previous case even second.* will also return the same result.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   119
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   120
Extracting files from archive:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   121
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   122
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   123
To extract the content from a archive, use *`x`* option: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   124
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   125
   $ mkdir extract
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   126
   $ cp allfiles.tar extract/
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   127
   $ cd extract
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   128
   $ tar -xvf allfiles.tar 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   129
   first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   130
   second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   131
   third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   132
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   133
To extract any particular file from archive, mention the name of file after *x* option: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   134
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   135
   $ tar -x second.txt -vf allfiles.tar 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   136
   second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   137
   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   138
    
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   139
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   140
GZip:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   141
=====
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   142
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   143
Tar creates archives but it does not compress data by itself unless specified explicitly. Hence all the archive we create using tar command, is simply of the size of total size of all individual files. With Linux there is a compression tool known as *gzip* which is used to reduce the size of files mentioned. Whenever possible, each file is replaced by one with the extension `.gz', so unlike `tar` this command would *replace the existing file*.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   144
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   145
Get going:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   146
----------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   147
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   148
As usual first commands to check out with gzip are *man* and *help*, ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   149
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   150
    $ man gzip
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   151
    $ gzip --help
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   152
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   153
Creating a zip of a bunch of files is fairly trivial, it can be done simply via: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   154
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   155
    $ gzip [OPTION]... [FILE]...
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   156
    
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   157
Creating zip files:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   158
~~~~~~~~~~~~~~~~~~~
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   159
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   160
Continuing from previous set of files and setup, we will like to zip them and hence the command would be: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   161
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   162
    $ gzip first.txt fourth.txt second.txt third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   163
    $ ls
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   164
    allfiles.tar  first.txt.gz  fourth.txt.gz  second.txt.gz  third.txt.gz  zipped.tar.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   165
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   166
Hence, as mentioned above, all original files are replaced by .gz extension. The above task can also be restated and made easy with help of some common regex expression: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   167
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   168
    $ gzip *.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   169
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   170
Similar to *tar* command, one can also use *`-v`* option here to see the output in *verbose* form. For the previous example, if we enable this option the result would be something like this: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   171
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   172
    $ gzip -v *.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   173
    first.txt:	  4.4% -- replaced with first.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   174
    fourth.txt:	 -7.1% -- replaced with fourth.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   175
    second.txt:	 -4.8% -- replaced with second.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   176
    third.txt:	  3.8% -- replaced with third.txt.gz    
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   177
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   178
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   179
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   180
    $ gzip -c *.txt > all.gz 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   181
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   182
Now in this case, all files would be zipped, concatenated and then the output would be written to a file all.gz leaving back all the original files. In the command above *`-c`* option states to print the output to standard output(stdout) and following *`>`* would redirect the output to file all.gz. So when we decompress this file, we will get a single file named 'all' with all the content of each files concatenated one after the another. 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   183
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   184
For creating a zip archive of a complete directory, one has to use *`-r`* options which means recursive, it makes gzip to traverse through all directory tree/structure. By default it will create zip files of each file inside the directory, that is even with the -r flag, gzip still compresses one file at a time : ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   185
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   186
    $ gzip -r fortune-files/
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   187
    $ gzip -rv .
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   188
    ./first.txt:	  4.4% -- replaced with ./first.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   189
    ./second.txt:	 -4.8% -- replaced with ./second.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   190
    ./third.txt:	  3.8% -- replaced with ./third.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   191
    ./allfiles.tar:	 96.6% -- replaced with ./allfiles.tar.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   192
    ./fourth.txt:	 -7.1% -- replaced with ./fourth.txt.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   193
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   194
Hence one always sees files like something.tar.gz, to create a zip of whole directory in a single file, first archive everything inside a folder and then use gzip on that. For zipping the files using tar itself, one has to use the option *`g`*. ::
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   195
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   196
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   197
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   198
    $ tar -cvzf zipped.tar.gz *.txt 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   199
    first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   200
    fourth.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   201
    second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   202
    third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   203
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   204
*Thats why gzip is designed as a complement to tar, not as a replacement.*
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   205
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   206
gzip command comes with a option *`-l`* to view the compressed file contents: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   207
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   208
    $ gzip -l zipped.tar.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   209
             compressed        uncompressed  ratio uncompressed_name
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   210
                332               10240      97.0% zipped.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   211
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   212
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   213
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   214
To decompress a already compressed file there are two options, either use *`gunzip`* command or use *`-d`* option with gzip command: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   215
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   216
    $ gzip -dv *.gz 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   217
    all.gz:	-440.4% -- replaced with all
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   218
    first.txt.gz:	  4.4% -- replaced with first.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   219
    fourth.txt.gz:	 -7.1% -- replaced with fourth.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   220
    second.txt.gz:	 -4.8% -- replaced with second.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   221
    third.txt.gz:	  3.8% -- replaced with third.txt
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   222
    zipped.tar.gz:	 97.0% -- replaced with zipped.tar
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   223
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   224
or: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   225
    
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   226
    $ gunzip -v *.gz
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   227
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   228
Both of those commands will give the same result. So here one can notice the content of file "all" which we created earlier, it will have content of all the rest of four files concatenated one after another, but "zipped.tar.gz" is zip of tar of all files, will effectively have zip of archives of all files separately, and hence the usage and importance of *tar*.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   229
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   230
Further Reading for this section:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   231
---------------------------------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   232
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   233
	* http://linuxreviews.org/beginner/
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   234
	* http://lowfatlinux.com/linux-gzip-gunzip.html
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   235
	* http://www.gnu.org/software/gzip/manual/gzip.html
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   236
	* http://en.wikipedia.org/wiki/ZIP_(file_format)
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   237
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   238
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   239
File Comparisons:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   240
=================
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   241
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   242
Linux based distributions also have some utilities for checking the content of files, comparing them very quickly to other files. These operations can be looking for differences/similarities. Some of the commands which prove handy are: 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   243
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   244
cmp:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   245
----
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   246
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   247
If one wants to compare two files whether they are same or not, one can use this handy tool. Let us consider some situation, we run find/locate command to locate some file, and it turns out that we have a file with same name in different location, and in case we want to run a quick check on there content, cmp is the right tool. Usage  ::
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   248
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   249
   $ cmp Desktop/programs/quick.c c-folder/quick.c
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   250
   Desktop/programs/quick.c c-folder/quick.c differ: byte 339, line 24
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   251
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   252
That is, if files differ, the byte and line number at which the first difference occurred is reported. 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   253
 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   254
diff:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   255
-----
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   256
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   257
Now there are situations when one wants to exactly know the differences among two files, for them, GNU diff can show whether files are different without detailing the differences. For simple and basic usage of this programs, consider following example: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   258
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   259
    $ echo -e "quick\nbrown\nfox\njumped\nover\nthe\nlazy\ndog" > allcorrect.txt
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   260
    $ echo -e "quick\nbrown\nfox\njmuped\nover\nteh\nlzay\ndog" > incorrect.txt
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   261
    $ diff problem.txt allc.txt 
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   262
    4c4
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   263
    < jmuped
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   264
    ---
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   265
    > jumped
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   266
    6,7c6,7
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   267
    < teh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   268
    < lzay
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   269
    ---
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   270
    > the
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   271
    > lazy
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   272
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   273
Looking at results above mentioned it is very trivial to deduce that, diff if used on two separate text files will result in line by line results for all the lines which are different. So most common use case scenario can be, got some files in various location of system with same name and size, just run diff through them and remove all the redundant files. Other similar command which one can find more effective for this can be *sdiff*, for the same files using sdiff will result in: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   274
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   275
    $ sdiff incorrect.txt allcorrect.txt 
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   276
    quick								quick
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   277
    brown								brown
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   278
    fox									fox
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   279
    jmuped							      |	jumped
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   280
    over								over
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   281
    teh								      |	the
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   282
    lzay							      |	lazy
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   283
    dog								      	dog   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   284
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   285
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   286
comm:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   287
-----
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   288
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   289
This is one more command which proves handy at times, the short and sweet man page states "compare two sorted files line by line". Or this it compares sorted files and selects or rejects lines common to two files. For ex: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   290
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   291
   $ sort allcorrect.txt>sortedcharac.txt; sort incorrect.txt>sortedprob.txt
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   292
   $ comm sortedcharac.txt sortedprob.txt 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   293
		brown
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   294
		dog
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   295
		fox
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   296
	jmuped
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   297
   jumped
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   298
   lazy
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   299
	lzay
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   300
		over
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   301
		quick
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   302
	teh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   303
   the
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   304
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   305
Environment Variables:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   306
======================
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   307
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   308
These variables like HOME, OSTYPE,Variables are a way of passing information from the shell to programs when you run them. Programs look "in the environment" for particular variables and if they are found will use the values stored. Standard UNIX variables are split into two categories, environment variables and shell variables. In broad terms, shell variables apply only to the current instance of the shell and are used to set short-term working conditions; environment variables have a farther reaching significance, and those set at login are valid for the duration of the session.By convention, environment variables have UPPER CASE and shell variables have lower case names.  
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   309
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   310
Some of examples of Environment variables are: ::
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   311
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   312
   $ echo $OSTYPE 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   313
   linux-gnu
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   314
   $ echo $HOME
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   315
   /home/user 
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   316
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   317
To see all the variables and there values use any of following commands: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   318
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   319
   $ printenv | less
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   320
   $ env
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   321
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   322
The most commonly used environment variable is "PATH", it defines a list of directories to search through when looking for a command to execute. If you decide to put your own programs in a bin directory under your home directory, you'll have to modify the path to include that directory, or the system will never find your programs (unless you happen to be in that directory when you enter the command). Here's how to change your PATH variable so it includes your personal bin directory: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   323
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   324
   $ set PATH=$PATH:$HOME/bin
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   325
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   326
See the difference in value of PATH variable before and after modifying it. One can also create its own variable to make things easier: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   327
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   328
   $ set repo = $HOME/Desktop/random/code
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   329
   $ cd $repo
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   330
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   331
*set* command is used to define a variable for the current shell. Try opening a new shell and use the above mentioned command, it wont work as expected. The other child process wont be able to see these variables unless we *export* them. Repeat the above mentioned activity with *export* command. Now with all new shells, *$repo* will work.
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   332
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   333
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   334
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   335
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   336
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   337
Shell Scripting:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   338
================
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   339
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   340
Basics:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   341
-------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   342
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   343
Shell program or shell script,a sequence of commands to a text file and tell the shell to execute the text file instead of entering the commands. The first *"Hello World"* sample for shell scripting is as easy as it sounds: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   344
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   345
   $ echo '#!/bin/sh' > my-script.sh
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   346
   $ echo 'clear' >> my-script.sh   
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   347
   $ echo 'echo Hello World' >> my-script.sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   348
   $ chmod 755 my-script.sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   349
   $ ./my-script.sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   350
   Hello World
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   351
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   352
The #! syntax(also known as shebang) is used in scripts to indicate an interpreter for execution under UNIX / Linux operating systems. The chmod is required to make the script executable. This script will just execute two commands, *clear* and *echo* one after another. One can also do the same task using a one liner command *clear; echo 'Hello World';* but as number of lines grows using a script file is helpful. 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   353
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   354
So lets create a script which gives us all the filenames for given initial alphabet or string in a directory. Let the name of script be *initial.sh*, open it with text editor, and write: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   355
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   356
   #!/bin/sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   357
   ls > temp
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   358
   grep ^$1 < temp
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   359
   rm temp
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   360
   $ chmod a+x initial.sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   361
   $ ./initial.sh s
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   362
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   363
The $1 in the script is pertaining to command line argument. All arguments passed via command line are accessed via *$#* with name of script being first member, that is $0. Now lets write a script for finding a file, and then checking when was it last modified: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   364
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   365
   #!/bin/sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   366
   name=`find . -name $1 -print`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   367
   echo $name
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   368
   last_modified=`stat -c %y $name| cut -f 1 -d " "`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   369
   echo "Last modified: $last_modified"    
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   370
   $ ./search.sh fname
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   371
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   372
Try giving some file you want to search in place of fname. Please note in second line *`* its a back-quote(other key mapped with tilda), it is specifically used to get the output of one command into a variable. In this particular case name is a User defined variables  which stores the value. We access value stored in any variable using *$* symbol before name of variable.
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   373
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   374
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   375
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   376
Shell Arithmetic:
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   377
-----------------
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   378
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   379
Shell also provides support for basic arithmetic operations. The syntax is: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   380
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   381
   $ expr op1 math-operator op2
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   382
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   383
Some of example which can be tried handily: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   384
   
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   385
   $ expr -3 + 5
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   386
   2
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   387
   $ expr 10 % 3
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   388
   1
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   389
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   390
These spaces in between operator and operands is important, without them shell interpreter will raise the syntax error. ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   391
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   392
   $ expr 2*3
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   393
   expr: syntax error
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   394
   
60
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   395
One can use back-quotes(`) also to get value of expr. ::
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   396
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   397
   $ echo `expr 6 + 3`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   398
   9
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   399
   $ result=`expr 6 + 3`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   400
   $ echo $result
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   401
   9
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   402
60
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   403
Shell uses three kinds of quotes. Double quotes("), anything enclosed among them except from variable trailing after $, and characters after \ would be printed as it is. Single quotes('), anything enclosed within them is just same, no formulation/interpretation. Back quotes(`), anything inclosed is considered as command, or is executed. ::
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   404
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   405
   $ echo "Today is date"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   406
   Today is date
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   407
   $ echo "Today is `date`"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   408
   Today is Wed Sep 16 17:32:22 IST 2009
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   409
   $ echo 'Today is `date`'
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   410
   Today is `date`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   411
   $ echo "Today is \n `date`"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   412
   Today is \n Wed Sep 16 17:40:13 IST 2009
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   413
   $ echo -e "Today is \n `date`"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   414
   Today is 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   415
    Wed Sep 16 17:41:13 IST 2009 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   416
60
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   417
if else construct:
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   418
------------------
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   419
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   420
One can have simple *if else if* constructs in shell scripts to check conditions. Lets take simple example of writing a script which returns back whether the argument passed is positive or not: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   421
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   422
   #!/bin/sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   423
   if test $1 -gt 0
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   424
   then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   425
     echo "number is positive"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   426
   else
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   427
     echo "number is negative"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   428
   fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   429
   $ ./sign.sh -11
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   430
   number is negative
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   431
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   432
This script will compare the first value passed as argument with 0 *if test var -gt val*, var being $1 and val being 0, gt meaning greater then. Now this program has some flaw, it will give same result for following input: (-11) and (-1, 5), as we are checking just $1 which is first argument and hence the result. For handling such situation we can include *if-else* clause which will warn user of correct usage of script. ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   433
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   434
   #this is the case when no argument is passed  
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   435
   if [ $# -eq 0 ]
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   436
   then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   437
     echo "$0 : You must give/supply one integers"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   438
     exit 1
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   439
   else 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   440
     if [ $# -gt 1 ]
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   441
     then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   442
       echo "$0 : You must give one integer"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   443
       exit 1
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   444
     fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   445
   fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   446
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   447
One important thing to note in shell script is spacing, with many comparison and evaluation operation a wrongly placed space will spoil all the fun. So in previous example the expression *[ $# -eq 0 ]* will work properly, but if we remove those leading or trailing spaces like *[ $# -eq 0]*, it wont work as expected, or rather throw a warning. Both *test* and *[]* do the same task of testing a expression and returning true or false.
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   448
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   449
Lets create something interesting using these if-else clause. Now we will create a script which will greet the user when he opens the shell. We will create the script, change the permission to make it executable and append the *.bashrc* file with *./greet.sh* line and we are done. The script is: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   450
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   451
   #!/bin/sh
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   452
   #Script to greet the user according to time of day
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   453
   temph=`date | cut -c12-13`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   454
   dat=`date +"%A %d in %B of %Y (%r)"`
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   455
   if [ $temph -lt 12 ]
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   456
   then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   457
     mess="Good Morning $LOGNAME, Have a nice day!"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   458
   fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   459
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   460
   if [ $temph -gt 12 -a $temph -le 16 ]
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   461
   then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   462
     mess="Good Afternoon $LOGNAME"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   463
   fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   464
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   465
   if [ $temph -gt 16 -a $temph -le 18 ]
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   466
   then
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   467
     mess="Good Evening $LOGNAME"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   468
   fi
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   469
   echo -e "$mess\nThis is $dat"
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   470
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   471
For me when I open the shell the output is something like: ::
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   472
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   473
   Good Morning user, Have a nice day!
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   474
   This is Wednesday 16 in September of 2009 (11:54:47 AM IST) 
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   475
56
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   476
Loops
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   477
-----
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   478
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   479
Bash has three different commands for looping -- ``for``, ``while`` and ``until``. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   480
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   481
``for`` loop
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   482
~~~~~~~~~~~~
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   483
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   484
Suppose we have a set of files, that have names beginning with numbers followed by their names - ``08 - Society.mp3``. We would like to rename these files to remove the numbering. How would we go about doing that? It is clear from the problem statement that we could use a ``for`` loop, to loop through the list of files and rename each of the files.  
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   485
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   486
Let's first look at a simple ``for`` loop, to understand how it works. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   487
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   488
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   489
  for animal in rat cat dog man
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   490
  do 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   491
    echo $animal
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   492
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   493
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   494
We just wrote a list of animals, each animal's name separated by a space and printed each name on a separate line. The variable ``animal`` is a dummy variable and has no significance. You could use something as lame as ``i`` in place of ``animal``.  
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   495
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   496
Now, we use a simple ``for`` loop to list the files that we are interested in. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   497
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   498
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   499
  ls *.mp3 > list
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   500
  for i in `cat list`
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   501
  do
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   502
    echo "$i"
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   503
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   504
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   505
If your filenames contain spaces, ``for`` assumes each space separated word to be a single item in the list and prints it in a separate line. We could change the script slightly to overcome this problem. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   506
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   507
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   508
  for i in *.mp3
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   509
  do
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   510
    echo "$i"
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   511
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   512
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   513
Now, we have each file printed on a separate line. Depending on the files that we have we could use grep to get the relevant portion of the filenames and rename the files. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   514
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   515
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   516
  for i in *.mp3
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   517
  do 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   518
    j=$(echo "$i"|grep -o "[A-Za-z'&. ]*.mp3")
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   519
    echo "$i -> $j"
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   520
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   521
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   522
Now we just replace the echo command with a ``mv``  command. 
56
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   523
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   524
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   525
  for i in *.mp3
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   526
  do 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   527
    j=$(echo "$i"|grep -o "[A-Za-z'&. ]*.mp3")
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   528
    mv "$i" "$j"
56
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   529
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   530
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   531
56
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   532
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   533
``while``
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   534
~~~~~~~~~
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   535
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   536
The ``while`` command allows us to continuously execute a block of commands until the command that is controlling the loop is executing successfully. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   537
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   538
Let's start with the lamest example of a while loop.
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   539
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   540
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   541
  while true
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   542
  do
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   543
    echo "True"
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   544
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   545
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   546
This, as you can see, is an infinite loop that prints the ``True``. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   547
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   548
Say we wish to write a simple program that takes user input and prints it back, until the input is ``quit``, which quits the program. 
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   549
::
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   550
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   551
  while [ "$variable" != "quit" ]
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   552
  do
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   553
    read variable
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   554
    echo "Input - $variable"
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   555
  done
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   556
  exit 0
eee394eb05fc Added Loops section in ULT, modified LaTeX handout to use examples from sample doc.
Puneeth Chaganti <puneeth@fossee.in>
parents: 54
diff changeset
   557
63
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   558
``until``
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   559
~~~~~~~~~
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   560
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   561
The ``until`` loop is similar to the ``while`` loop, except that it executes until the conditional command does not execute properly. 
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   562
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   563
The infinite loop changes to the following, when ``until`` is used.
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   564
::
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   565
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   566
  until false
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   567
  do
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   568
    echo "True"
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   569
  done
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   570
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   571
Now lets try and use these above mentioned options provided by shell to write a utility. Until now, when we try find or locate it looks through directories and files for result. But they wont search through tar archives and zipped files. Lets create a shell script for especially looking through these files
dc13f22e9489 Minor changes in ULT-sessions 4,5 and LaTeX handout for Sphinx build.
Puneeth Chaganti <puneeth@fossee.in>
parents: 60
diff changeset
   572
::
60
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   573
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   574
  #!/bin/sh
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   575
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   576
  #To check number of arguments being passed.
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   577
  if [ $# -eq 0 ] ; then
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   578
  echo "Correct usage: $0 tar-archive filename \nOr $0 filename"
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   579
  exit 1
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   580
  else
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   581
    if [ $# -eq 1 ] ; then
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   582
      tar_archive=`find $PWD -name "*.tar*"`
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   583
    else
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   584
      tar_archive=`find $PWD -name $1`
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   585
    fi
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   586
  fi
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   587
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   588
  #Search of particular file inside archives.
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   589
  for archive in $tar_archive
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   590
  do
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   591
    echo $archive
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   592
    variable=`tar -tf $archive`
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   593
    for word in $variable
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   594
    do
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   595
      if [ $# -eq 1 ] ; then
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   596
        echo "$word" | grep -q ".*$1"
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   597
      else
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   598
	echo "$word" | grep -q ".*$2"
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   599
      fi
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   600
    if [ $? -eq 0 ] ; then 
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   601
      echo "File present in $archive!" 
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   602
    fi  
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   603
    done
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   604
  done
8a36825e21c5 Arithmetic section, typo correction, eg script.
Shantanu <shantanu@fossee.in>
parents: 59
diff changeset
   605
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   606
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   607
Functions
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   608
---------
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   609
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   610
When a group of commands are repeatedly being used within a script, it is convenient to group them as a function. This saves a lot of time and you can avoid retyping the code again and again. Also, it will help you maintain your code easily. Let's see how we can define a simple function, ``hello-world``. Function can be defined by using function name followed by a pair of parentheses. 
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   611
::
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   612
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   613
  
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   614
  hello-world () {
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   615
    echo "Hello, World.";
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   616
  }
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   617
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   618
  $ hello-world
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   619
  Hello, World.
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   620
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   621
Passing parameters to functions is similar to passing them to scripts. 
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   622
::
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   623
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   624
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   625
  #! /bin/bash
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   626
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   627
  hello-name()
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   628
  {
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   629
     echo  "hello ". $1
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   630
        
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   631
  }
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   632
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   633
  hello-name $1
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   634
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   635
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   636
  #!usr/bin/bash
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   637
  hello-name
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   638
  { 
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   639
  echo "Hello, $1."; 
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   640
  }
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   641
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   642
  hello-name $1
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   643
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   644
  save this in a file helloscipt.sh and give it execute permission
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   645
  
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   646
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   647
  $ ./helloscipt 9
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   648
  Hello, 9.
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   649
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   650
Any variables that you define within a function, will be added to the global namespace. If you wish to define variables that are restricted to the scope of the function, define a variable using the ``local`` built-in command of bash.
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   651
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   652
  
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   653
We shall now write a function for the word frequency generating script that we had looked at in the previous session. 
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   654
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   655
::
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   656
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   657
  word_frequency() {
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   658
    if [ $# -ne 1 ]
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   659
    then
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   660
      echo "Usage: $0 file_name"
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   661
      exit 1
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   662
    else 
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   663
      if [ -f "$1" ]
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   664
      then
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   665
        grep  "[A-Za-z]*" -o "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | less
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   666
      fi
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   667
    fi
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   668
  }
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   669
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   670
 word_frequency  $1
59
8c15077f028d Added a section on functions in ULT; minor edits to SciTE section.
Puneeth Chaganti <puneeth@fossee.in>
parents: 56
diff changeset
   671
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   672
100
344a1d6f1e64 Changes to shell scripting
amit@thunder
parents: 91
diff changeset
   673
54
bed3fe467e21 First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff changeset
   674