author | amit |
Tue, 07 Sep 2010 11:03:27 +0530 | |
changeset 123 | 7a16c80c584d |
parent 100 | 344a1d6f1e64 |
permissions | -rw-r--r-- |
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 | 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 | 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 | 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`*. :: |
195 |
||
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 | 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 | 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 | 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 | 259 |
$ echo -e "quick\nbrown\nfox\njumped\nover\nthe\nlazy\ndog" > allcorrect.txt |
260 |
$ echo -e "quick\nbrown\nfox\njmuped\nover\nteh\nlzay\ndog" > incorrect.txt |
|
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 624 |
|
625 |
#! /bin/bash |
|
626 |
||
627 |
hello-name() |
|
628 |
{ |
|
629 |
echo "hello ". $1 |
|
630 |
||
631 |
} |
|
632 |
||
633 |
hello-name $1 |
|
634 |
||
635 |
||
636 |
#!usr/bin/bash |
|
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 | 642 |
hello-name $1 |
643 |
||
644 |
save this in a file helloscipt.sh and give it execute permission |
|
645 |
||
646 |
||
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 | 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 | 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 | 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 | 673 |
|
54
bed3fe467e21
First version of 5-6 Session of ult.
Shantanu <shantanu@fossee.in>
parents:
diff
changeset
|
674 |