SEESenv/web/html/chn11Section_5.html
changeset 42 1f61ee485958
parent 41 e54725be4df6
child 43 134b87b382f5
equal deleted inserted replaced
41:e54725be4df6 42:1f61ee485958
     1 <html>
       
     2 <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Chapter. Section_</title><link rel="stylesheet" href="/review/support/styles.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.74.3" /><link rel="shortcut icon" type="image/png" href="/review/support/figs/favicon.png" /><script type="text/javascript" src="/review/support/jquery-min.js"></script><script type="text/javascript" src="/review/support/form.js"></script><script type="text/javascript" src="/review/support/hsbook.js"></script></head>
       
     3 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="chapter" id="ch11Section_5">
       
     4 <div class="titlepage"></div>
       
     5 <div class="toc">
       
     6 <p><b>Table of Contents</b></p>
       
     7 <dl>
       
     8 <dt><span class="article"><a href="#id2647624"></a></span></dt>
       
     9 <dd><dl>
       
    10 <dt><span class="section"><a href="#id2457715">1. Module Objectives:</a></span></dt>
       
    11 <dt><span class="section"><a href="#id2645976">2. tar:</a></span></dt>
       
    12 <dd><dl>
       
    13 <dt><span class="section"><a href="#id2646529">2.1. Introduction:</a></span></dt>
       
    14 <dt><span class="section"><a href="#id2698596">2.2. Getting Started(go go go!):</a></span></dt>
       
    15 <dt><span class="section"><a href="#id2698875">2.3. Further Reading for this section:</a></span></dt>
       
    16 </dl></dd>
       
    17 <dt><span class="section"><a href="#id2698920">3. GZip:</a></span></dt>
       
    18 <dd><dl>
       
    19 <dt><span class="section"><a href="#id2698946">3.1. Get going:</a></span></dt>
       
    20 <dt><span class="section"><a href="#id2699199">3.2. Further Reading for this section:</a></span></dt>
       
    21 </dl></dd>
       
    22 <dt><span class="section"><a href="#id2699253">4. File Comparisons:</a></span></dt>
       
    23 <dd><dl>
       
    24 <dt><span class="section"><a href="#id2699270">4.1. cmp:</a></span></dt>
       
    25 <dt><span class="section"><a href="#id2699312">4.2. diff:</a></span></dt>
       
    26 <dt><span class="section"><a href="#id2699394">4.3. comm:</a></span></dt>
       
    27 </dl></dd>
       
    28 <dt><span class="section"><a href="#id2699424">5. Environment Variables:</a></span></dt>
       
    29 <dd><dl><dt><span class="section"><a href="#id2699524">5.1. Further Reading:</a></span></dt></dl></dd>
       
    30 <dt><span class="section"><a href="#id2699578">6. Shell Scripting:</a></span></dt>
       
    31 <dd><dl>
       
    32 <dt><span class="section"><a href="#id2699586">6.1. Basics:</a></span></dt>
       
    33 <dt><span class="section"><a href="#id2697944">6.2. Shell Arithmetic:</a></span></dt>
       
    34 <dt><span class="section"><a href="#id2699963">6.3. if else construct:</a></span></dt>
       
    35 <dt><span class="section"><a href="#id2700069">6.4. Loops</a></span></dt>
       
    36 <dt><span class="section"><a href="#id2700315">6.5. Functions</a></span></dt>
       
    37 <dt><span class="section"><a href="#id2700386">6.6. Further Reading:</a></span></dt>
       
    38 </dl></dd>
       
    39 </dl></dd>
       
    40 </dl>
       
    41 </div>
       
    42 <div class="article">
       
    43 <div class="titlepage">
       
    44 <div>
       
    45 <div><h2 class="title" id="id2647624"></h2></div>
       
    46 <div><h2 class="title" id="id2647624"></h2></div>
       
    47 </div>
       
    48 <hr />
       
    49 </div>
       
    50 <div class="toc">
       
    51 <p><b>Table of Contents</b></p>
       
    52 <dl>
       
    53 <dt><span class="section"><a href="#id2457715">1. Module Objectives:</a></span></dt>
       
    54 <dt><span class="section"><a href="#id2645976">2. tar:</a></span></dt>
       
    55 <dd><dl>
       
    56 <dt><span class="section"><a href="#id2646529">2.1. Introduction:</a></span></dt>
       
    57 <dt><span class="section"><a href="#id2698596">2.2. Getting Started(go go go!):</a></span></dt>
       
    58 <dt><span class="section"><a href="#id2698875">2.3. Further Reading for this section:</a></span></dt>
       
    59 </dl></dd>
       
    60 <dt><span class="section"><a href="#id2698920">3. GZip:</a></span></dt>
       
    61 <dd><dl>
       
    62 <dt><span class="section"><a href="#id2698946">3.1. Get going:</a></span></dt>
       
    63 <dt><span class="section"><a href="#id2699199">3.2. Further Reading for this section:</a></span></dt>
       
    64 </dl></dd>
       
    65 <dt><span class="section"><a href="#id2699253">4. File Comparisons:</a></span></dt>
       
    66 <dd><dl>
       
    67 <dt><span class="section"><a href="#id2699270">4.1. cmp:</a></span></dt>
       
    68 <dt><span class="section"><a href="#id2699312">4.2. diff:</a></span></dt>
       
    69 <dt><span class="section"><a href="#id2699394">4.3. comm:</a></span></dt>
       
    70 </dl></dd>
       
    71 <dt><span class="section"><a href="#id2699424">5. Environment Variables:</a></span></dt>
       
    72 <dd><dl><dt><span class="section"><a href="#id2699524">5.1. Further Reading:</a></span></dt></dl></dd>
       
    73 <dt><span class="section"><a href="#id2699578">6. Shell Scripting:</a></span></dt>
       
    74 <dd><dl>
       
    75 <dt><span class="section"><a href="#id2699586">6.1. Basics:</a></span></dt>
       
    76 <dt><span class="section"><a href="#id2697944">6.2. Shell Arithmetic:</a></span></dt>
       
    77 <dt><span class="section"><a href="#id2699963">6.3. if else construct:</a></span></dt>
       
    78 <dt><span class="section"><a href="#id2700069">6.4. Loops</a></span></dt>
       
    79 <dt><span class="section"><a href="#id2700315">6.5. Functions</a></span></dt>
       
    80 <dt><span class="section"><a href="#id2700386">6.6. Further Reading:</a></span></dt>
       
    81 </dl></dd>
       
    82 </dl>
       
    83 </div>
       
    84 <div class="section" title="1.Module Objectives:">
       
    85 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
    86 <a name="id2457715"></a>1.Module Objectives:</h2></div></div></div>
       
    87 <p id="ch11Section_5_1">After successfully completing this module a participant will be able to:</p>
       
    88 <pre class="programlisting">
       
    89 - Understand
       
    90   * What are archives and zipped files                              U
       
    91   * What are environment variables                                  U
       
    92   * What are Shell Scripts                                          U
       
    93 - Able to use file comparison commands like                         Ap
       
    94   diff, cmp, comm
       
    95 - Create and extract archives(.tar files) and zipped files(.gz)     Ap
       
    96 - Set/Modify environment as per need                                Ap
       
    97 - Create shell scripts to automate tasks.                           Ap</pre>
       
    98 </div>
       
    99 <div class="section" title="2.tar:">
       
   100 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
   101 <a name="id2645976"></a>2.tar:</h2></div></div></div>
       
   102 <div class="section" title="2.1.Introduction:">
       
   103 <div class="titlepage"><div><div><h3 class="title">
       
   104 <a name="id2646529"></a>2.1.Introduction:</h3></div></div></div>
       
   105 <p id="ch11Section_5_2">In world of Linux based distribution, <span class="emphasis"><em>tarballs</em></span> 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 <span class="emphasis"><em>tar</em></span> archives is to: <span class="emphasis"><em>Store, backup, and transport</em></span>.</p>
       
   106 <p id="ch11Section_5_3">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.</p>
       
   107 </div>
       
   108 <div class="section" title="2.2.Getting Started(go go go!):">
       
   109 <div class="titlepage"><div><div><h3 class="title">
       
   110 <a name="id2698596"></a>2.2.Getting Started(go go go!):</h3></div></div></div>
       
   111 <p id="ch11Section_5_4">As mentioned previously and if not, <span class="emphasis"><em>The best way to get started with any command line tool of Linux is to use "man".</em></span></p>
       
   112 <pre class="programlisting">
       
   113 $ man tar</pre>
       
   114 <p id="ch11Section_5_5">or try these commands(the output may vary with different installations):</p>
       
   115 <pre class="programlisting">
       
   116 $ tar --version
       
   117 tar (GNU tar) 1.20
       
   118 Copyright (C) 2008 Free Software Foundation, Inc.
       
   119 License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
       
   120 This is free software: you are free to change and redistribute it.
       
   121 There is NO WARRANTY, to the extent permitted by law.
       
   122 
       
   123 Written by John Gilmore and Jay Fenlason.
       
   124 
       
   125 $ tar --help
       
   126 Usage: tar [OPTION...] [FILE]...
       
   127 GNU `tar' saves many files together into a single tape or disk archive, and can
       
   128 restore individual files from the archive.
       
   129 Examples:
       
   130 tar -cf archive.tar foo bar  # Create archive.tar from files foo and bar.
       
   131 tar -tvf archive.tar         # List all files in archive.tar verbosely.
       
   132 tar -xf archive.tar          # Extract all files from archive.tar.
       
   133 ____________</pre>
       
   134 <div class="section" title="2.2.1.Creating a tar archive:">
       
   135 <div class="titlepage"><div><div><h4 class="title">
       
   136 <a name="id2698650"></a>2.2.1.Creating a tar archive:</h4></div></div></div>
       
   137 <p id="ch11Section_5_6">We will do some off-the road activity for this exercise. We will use an interesting command <span class="emphasis"><em>fortune</em></span> 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.</p>
       
   138 <pre class="programlisting">
       
   139 $ mkdir fortune-files
       
   140 $ cd fortune-files/
       
   141 $ fortune &gt; first.txt
       
   142 $ cat first.txt
       
   143 Expect the worst, it's the least you can do.
       
   144 $ fortune &gt; second.txt
       
   145 $ fortune &gt; third.txt
       
   146 $ ls
       
   147 first.txt  second.txt  third.txt</pre>
       
   148 <p id="ch11Section_5_7">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:</p>
       
   149 <pre class="programlisting">
       
   150 $ tar --create --verbose --file=allfiles.tar first.txt second.txt third.txt
       
   151 first.txt
       
   152 second.txt
       
   153 third.txt
       
   154 $ ls
       
   155 allfiles.tar  first.txt  second.txt  third.txt</pre>
       
   156 <p id="ch11Section_5_8">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:</p>
       
   157 <pre class="programlisting">
       
   158 $ tar -c -v -f allfiles.tar first.txt second.txt third.txt</pre>
       
   159 <p id="ch11Section_5_9">or</p>
       
   160 <pre class="programlisting">
       
   161 $ tar -cvf allfiles.tar first.txt second.txt third.txt</pre>
       
   162 <p id="ch11Section_5_a">The general format for creating a tar archive is:</p>
       
   163 <pre class="programlisting">
       
   164 tar [OPTION...] [FILE]...</pre>
       
   165 <p id="ch11Section_5_b">For our command are using these options:</p>
       
   166 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   167 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_c">-c to Create the archive.</p></li>
       
   168 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_d">-v for Verbose mode, to get the names of the files as they are archived.</p></li>
       
   169 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_e">-f mentioning the file name of the resulting tar archive.</p></li>
       
   170 </ul></div>
       
   171 <p id="ch11Section_5_f">To create archive of folder itself try this:</p>
       
   172 <pre class="programlisting">
       
   173 $ tar -cvf fortune.tar fortune/</pre>
       
   174 <p id="ch11Section_5_10">To add files to existing tar archive, option <span class="emphasis"><em>`r`</em></span> is used:</p>
       
   175 <pre class="programlisting">
       
   176 $ fortune &gt; fourth.txt
       
   177 $ tar -r fourth.txt -vf allfiles.tar
       
   178 fourth.txt</pre>
       
   179 <p id="ch11Section_5_11">There are other options too available for explicitly mentioning the position of archive, use <span class="emphasis"><em>tar --help</em></span> for getting all the details.</p>
       
   180 <p id="ch11Section_5_12">Similarly to remove file from archive use <span class="emphasis"><em>--delete</em></span> option:</p>
       
   181 <pre class="programlisting">
       
   182 $ tar --delete second.txt -f allfiles.tar
       
   183 $ tar -tf allfiles.tar
       
   184 first.txt
       
   185 third.txt
       
   186 fourth.txt</pre>
       
   187 </div>
       
   188 <div class="section" title="2.2.2.Listing the files of archive:">
       
   189 <div class="titlepage"><div><div><h4 class="title">
       
   190 <a name="id2698790"></a>2.2.2.Listing the files of archive:</h4></div></div></div>
       
   191 <p id="ch11Section_5_13">Once files are archived, tar command have the <span class="emphasis"><em>`t`</em></span> option, for Listing all files in the tar file:</p>
       
   192 <pre class="programlisting">
       
   193 $ tar tf allfiles.tar
       
   194 first.txt
       
   195 second.txt
       
   196 third.txt</pre>
       
   197 <p id="ch11Section_5_14"><span class="strong"><strong>//this is not working for me in some cases :(</strong></span></p>
       
   198 <p id="ch11Section_5_15">To locate a particular file among the archive mention its name after <span class="emphasis"><em>t</em></span> option.</p>
       
   199 <pre class="programlisting">
       
   200 $ tar t second.txt allfiles.tar
       
   201 second.txt</pre>
       
   202 <p id="ch11Section_5_16">one can also use elementary regex for locating the file, so in previous case even second.* will also return the same result.</p>
       
   203 </div>
       
   204 <div class="section" title="2.2.3.Extracting files from archive:">
       
   205 <div class="titlepage"><div><div><h4 class="title">
       
   206 <a name="id2698840"></a>2.2.3.Extracting files from archive:</h4></div></div></div>
       
   207 <p id="ch11Section_5_17">To extract the content from a archive, use <span class="emphasis"><em>`x`</em></span> option:</p>
       
   208 <pre class="programlisting">
       
   209 $ mkdir extract
       
   210 $ cp allfiles.tar extract/
       
   211 $ cd extract
       
   212 $ tar -xvf allfiles.tar
       
   213 first.txt
       
   214 second.txt
       
   215 third.txt</pre>
       
   216 <p id="ch11Section_5_18">To extract any particular file from archive, mention the name of file after <span class="emphasis"><em>x</em></span> option:</p>
       
   217 <pre class="programlisting">
       
   218 $ tar -x second.txt -vf allfiles.tar
       
   219 second.txt</pre>
       
   220 </div>
       
   221 </div>
       
   222 <div class="section" title="2.3.Further Reading for this section:">
       
   223 <div class="titlepage"><div><div><h3 class="title">
       
   224 <a name="id2698875"></a>2.3.Further Reading for this section:</h3></div></div></div>
       
   225 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   226 <li class="listitem" style="list-style-type: *">
       
   227 <p id="ch11Section_5_19"></p>
       
   228 <div class="reference">
       
   229 <div class="titlepage"><hr /></div>http://en.wikipedia.org/wiki/Tar_(file_format</div>
       
   230 <p>)</p>
       
   231 </li>
       
   232 <li class="listitem" style="list-style-type: *">
       
   233 <p id="ch11Section_5_1a"></p>
       
   234 <div class="reference">
       
   235 <div class="titlepage"><hr /></div>http://www.gnu.org/software/tar/manual/tar.html</div>
       
   236 </li>
       
   237 <li class="listitem" style="list-style-type: *">
       
   238 <p id="ch11Section_5_1b"></p>
       
   239 <div class="reference">
       
   240 <div class="titlepage"><hr /></div>http://linuxreviews.org/beginner/</div>
       
   241 </li>
       
   242 </ul></div>
       
   243 </div>
       
   244 </div>
       
   245 <div class="section" title="3.GZip:">
       
   246 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
   247 <a name="id2698920"></a>3.GZip:</h2></div></div></div>
       
   248 <p id="ch11Section_5_1c">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 <span class="emphasis"><em>gzip</em></span> 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 <span class="emphasis"><em>replace the existing file</em></span>.</p>
       
   249 <div class="section" title="3.1.Get going:">
       
   250 <div class="titlepage"><div><div><h3 class="title">
       
   251 <a name="id2698946"></a>3.1.Get going:</h3></div></div></div>
       
   252 <p id="ch11Section_5_1d">As usual first commands to check out with gzip are <span class="emphasis"><em>man</em></span> and <span class="emphasis"><em>help</em></span>,</p>
       
   253 <pre class="programlisting">
       
   254 $ man gzip
       
   255 $ gzip --help</pre>
       
   256 <p id="ch11Section_5_1e">Creating a zip of a bunch of files is fairly trivial, it can be done simply via:</p>
       
   257 <pre class="programlisting">
       
   258 $ gzip [OPTION]... [FILE]...</pre>
       
   259 <div class="section" title="3.1.1.Creating zip files:">
       
   260 <div class="titlepage"><div><div><h4 class="title">
       
   261 <a name="id2698976"></a>3.1.1.Creating zip files:</h4></div></div></div>
       
   262 <p id="ch11Section_5_1f">Continuing from previous set of files and setup, we will like to zip them and hence the command would be:</p>
       
   263 <pre class="programlisting">
       
   264 $ gzip first.txt fourth.txt second.txt third.txt
       
   265 $ ls
       
   266 allfiles.tar  first.txt.gz  fourth.txt.gz  second.txt.gz  third.txt.gz  zipped.tar.gz</pre>
       
   267 <p id="ch11Section_5_20">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:</p>
       
   268 <pre class="programlisting">
       
   269 $ gzip *.txt</pre>
       
   270 <p id="ch11Section_5_21">Similar to <span class="emphasis"><em>tar</em></span> command, one can also use <span class="emphasis"><em>`-v`</em></span> option here to see the output in <span class="emphasis"><em>verbose</em></span> form. For the previous example, if we enable this option the result would be something like this:</p>
       
   271 <pre class="programlisting">
       
   272 $ gzip -v *.txt
       
   273 first.txt:    4.4% -- replaced with first.txt.gz
       
   274 fourth.txt:  -7.1% -- replaced with fourth.txt.gz
       
   275 second.txt:  -4.8% -- replaced with second.txt.gz
       
   276 third.txt:    3.8% -- replaced with third.txt.gz</pre>
       
   277 <p id="ch11Section_5_22">For files of very small sizes and some other cases, one might end up with a zipped file whose size is greater then original file, but compression is always performed(so don't be disheartened in the above case, as files are larger :P). So unlike tar, here all files are zipped separately by default, to make them part of one single chunk one can use some <span class="emphasis"><em>pipes</em></span> and <span class="emphasis"><em>redirections</em></span></p>
       
   278 <pre class="programlisting">
       
   279 $ gzip -c *.txt &gt; all.gz</pre>
       
   280 <p id="ch11Section_5_23">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 <span class="emphasis"><em>`-c`</em></span> option states to print the output to standard output(stdout) and following <span class="emphasis"><em>`&gt;`</em></span> 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.</p>
       
   281 <p id="ch11Section_5_24">For creating a zip archive of a complete directory, one has to use <span class="emphasis"><em>`-r`</em></span> 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 :</p>
       
   282 <pre class="programlisting">
       
   283 $ gzip -r fortune-files/
       
   284 $ gzip -rv .
       
   285 ./first.txt:          4.4% -- replaced with ./first.txt.gz
       
   286 ./second.txt:        -4.8% -- replaced with ./second.txt.gz
       
   287 ./third.txt:          3.8% -- replaced with ./third.txt.gz
       
   288 ./allfiles.tar:      96.6% -- replaced with ./allfiles.tar.gz
       
   289 ./fourth.txt:        -7.1% -- replaced with ./fourth.txt.gz</pre>
       
   290 <p id="ch11Section_5_25">Hence one always sees files like xxxxx.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 <span class="emphasis"><em>`g`</em></span>.</p>
       
   291 <pre class="programlisting">
       
   292 $ tar -cvzf zipped.tar.gz *.txt
       
   293 first.txt
       
   294 fourth.txt
       
   295 second.txt
       
   296 third.txt</pre>
       
   297 <p id="ch11Section_5_26"><span class="emphasis"><em>Thats why gzip is designed as a complement to tar, not as a replacement.</em></span></p>
       
   298 <p id="ch11Section_5_27">gzip command comes with a option <span class="emphasis"><em>`-l`</em></span> to view the compressed file contents:</p>
       
   299 <pre class="programlisting">
       
   300 $ gzip -l zipped.tar.gz
       
   301          compressed        uncompressed  ratio uncompressed_name
       
   302             332               10240      97.0% zipped.tar</pre>
       
   303 <p id="ch11Section_5_28">Other feature of gzip is option for mentioning the kind of compression one wants. There is a option of <span class="emphasis"><em>`-n`</em></span> where <span class="emphasis"><em>n varies from 0 to 9</em></span> which regulate the speed/quality of compression. With <span class="emphasis"><em>`-1`</em></span> or <span class="emphasis"><em>`--fast`</em></span> option it means the fastest compression method (less compression) and <span class="emphasis"><em>`--best`</em></span> or <span class="emphasis"><em>`-9`</em></span> indicates the slowest compression method, default compression level is <span class="emphasis"><em>`-6`</em></span>.</p>
       
   304 <p id="ch11Section_5_29">To decompress a already compressed file there are two options, either use <span class="emphasis"><em>`gunzip`</em></span> command or use <span class="emphasis"><em>`-d`</em></span> option with gzip command:</p>
       
   305 <pre class="programlisting">
       
   306 $ gzip -dv *.gz
       
   307 all.gz:     -440.4% -- replaced with all
       
   308 first.txt.gz:         4.4% -- replaced with first.txt
       
   309 fourth.txt.gz:       -7.1% -- replaced with fourth.txt
       
   310 second.txt.gz:       -4.8% -- replaced with second.txt
       
   311 third.txt.gz:         3.8% -- replaced with third.txt
       
   312 zipped.tar.gz:       97.0% -- replaced with zipped.tar</pre>
       
   313 <p id="ch11Section_5_2a">or:</p>
       
   314 <pre class="programlisting">
       
   315 $ gunzip -v *.gz</pre>
       
   316 <p id="ch11Section_5_2b">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 <span class="emphasis"><em>tar</em></span>.</p>
       
   317 </div>
       
   318 </div>
       
   319 <div class="section" title="3.2.Further Reading for this section:">
       
   320 <div class="titlepage"><div><div><h3 class="title">
       
   321 <a name="id2699199"></a>3.2.Further Reading for this section:</h3></div></div></div>
       
   322 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   323 <li class="listitem" style="list-style-type: *">
       
   324 <p id="ch11Section_5_2c"></p>
       
   325 <div class="reference">
       
   326 <div class="titlepage"><hr /></div>http://linuxreviews.org/beginner/</div>
       
   327 </li>
       
   328 <li class="listitem" style="list-style-type: *">
       
   329 <p id="ch11Section_5_2d"></p>
       
   330 <div class="reference">
       
   331 <div class="titlepage"><hr /></div>http://lowfatlinux.com/linux-gzip-gunzip.html</div>
       
   332 </li>
       
   333 <li class="listitem" style="list-style-type: *">
       
   334 <p id="ch11Section_5_2e"></p>
       
   335 <div class="reference">
       
   336 <div class="titlepage"><hr /></div>http://www.gnu.org/software/gzip/manual/gzip.html</div>
       
   337 </li>
       
   338 <li class="listitem" style="list-style-type: *">
       
   339 <p id="ch11Section_5_2f"></p>
       
   340 <div class="reference">
       
   341 <div class="titlepage"><hr /></div>http://en.wikipedia.org/wiki/ZIP_(file_format</div>
       
   342 <p>)</p>
       
   343 </li>
       
   344 </ul></div>
       
   345 </div>
       
   346 </div>
       
   347 <div class="section" title="4.File Comparisons:">
       
   348 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
   349 <a name="id2699253"></a>4.File Comparisons:</h2></div></div></div>
       
   350 <p id="ch11Section_5_30">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:</p>
       
   351 <div class="section" title="4.1.cmp:">
       
   352 <div class="titlepage"><div><div><h3 class="title">
       
   353 <a name="id2699270"></a>4.1.cmp:</h3></div></div></div>
       
   354 <p id="ch11Section_5_31">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. For my system I perform these tasks to illustrate the use of this command:</p>
       
   355 <pre class="programlisting">
       
   356 $ find . -name quick.c
       
   357 ./Desktop/programs/quick.c
       
   358 ./c-folder/quick.c
       
   359 $ cmp Desktop/programs/quick.c c-folder/quick.c
       
   360 $</pre>
       
   361 <p id="ch11Section_5_32">For me it returns nothing, hence that means both the files are exact copy of each other, by default, cmp is silent if the files are the same. Make some changes in one of the file and rerun the command. For me it works like this:</p>
       
   362 <pre class="programlisting">
       
   363 $ cmp Desktop/programs/quick.c c-folder/quick.c
       
   364 Desktop/programs/quick.c c-folder/quick.c differ: byte 339, line 24</pre>
       
   365 <p id="ch11Section_5_33">That is, if files differ, the byte and line number at which the first difference occurred is reported.</p>
       
   366 </div>
       
   367 <div class="section" title="4.2.diff:">
       
   368 <div class="titlepage"><div><div><h3 class="title">
       
   369 <a name="id2699312"></a>4.2.diff:</h3></div></div></div>
       
   370 <p id="ch11Section_5_34">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:</p>
       
   371 <pre class="programlisting">
       
   372 $ echo -e "quick nbrown nfox njumped nover nthe nlazy ndog" &gt; allcharacters.txt
       
   373 $ echo -e "quick nbrown nfox njmuped nover nteh nlzay ndog" &gt; problem.txt
       
   374 $ diff problem.txt allcharacters.txt
       
   375 4c4
       
   376 &lt; jmuped
       
   377 ---
       
   378 &gt; jumped
       
   379 6,7c6,7
       
   380 &lt; teh
       
   381 &lt; lzay
       
   382 ---
       
   383 &gt; the
       
   384 &gt; lazy</pre>
       
   385 <p id="ch11Section_5_35">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 <span class="emphasis"><em>sdiff</em></span>, for the same files using sdiff will result in:</p>
       
   386 <pre class="programlisting">
       
   387 $ sdiff problem.txt allcharacters.txt
       
   388 quick                                                               quick
       
   389 brown                                                               brown
       
   390 fox                                                                 fox
       
   391 jmuped                                                            | jumped
       
   392 over                                                                over
       
   393 teh                                                               | the
       
   394 lzay                                                              | lazy
       
   395 dog                                                                 dog</pre>
       
   396 <p id="ch11Section_5_36">Some exercise for a change:</p>
       
   397 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   398 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_37">Try using diff for any binary file, does it work?</p></li>
       
   399 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_38">What are other equivalent for diff command based on needs/requirements?</p></li>
       
   400 <li class="listitem" style="list-style-type: *"><p id="ch11Section_5_39">Can we use diff to compare two directories? If yes how?</p></li>
       
   401 </ul></div>
       
   402 </div>
       
   403 <div class="section" title="4.3.comm:">
       
   404 <div class="titlepage"><div><div><h3 class="title">
       
   405 <a name="id2699394"></a>4.3.comm:</h3></div></div></div>
       
   406 <p id="ch11Section_5_3a">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:</p>
       
   407 <pre class="programlisting">
       
   408 $ sort allcharacters.txt&gt;sortedcharac.txt; sort problem.txt&gt;sortedprob.txt
       
   409 $ comm sortedcharac.txt sortedprob.txt
       
   410              brown
       
   411              dog
       
   412              fox
       
   413      jmuped
       
   414 jumped
       
   415 lazy
       
   416      lzay
       
   417              over
       
   418              quick
       
   419      teh
       
   420 the</pre>
       
   421 </div>
       
   422 </div>
       
   423 <div class="section" title="5.Environment Variables:">
       
   424 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
   425 <a name="id2699424"></a>5.Environment Variables:</h2></div></div></div>
       
   426 <p id="ch11Section_5_3b">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.</p>
       
   427 <p id="ch11Section_5_3c">Some of examples of Environment variables are(result may vary!):</p>
       
   428 <pre class="programlisting">
       
   429 $ echo $OSTYPE
       
   430 linux-gnu
       
   431 $ echo $HOME
       
   432 /home/baali</pre>
       
   433 <p id="ch11Section_5_3d">To see all the variables and there values use any of following commands:</p>
       
   434 <pre class="programlisting">
       
   435 $ printenv | less
       
   436 $ env</pre>
       
   437 <p id="ch11Section_5_3e">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:</p>
       
   438 <pre class="programlisting">
       
   439 $ set PATH=$PATH:$HOME/bin</pre>
       
   440 <p id="ch11Section_5_3f">See the difference in value of PATH variable before and after modifying it. One can also create its own variable to make things easier:</p>
       
   441 <pre class="programlisting">
       
   442 $ set repo = $HOME/Desktop/random/code
       
   443 $ cd $repo</pre>
       
   444 <p id="ch11Section_5_40"><span class="emphasis"><em>set</em></span> 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 <span class="emphasis"><em>export</em></span> them. Repeat the above mentioned activity with <span class="emphasis"><em>export</em></span> command. Now with all new shells, <span class="emphasis"><em>$repo</em></span> will work.</p>
       
   445 <p id="ch11Section_5_41">Again these changes are limited to current session. To make them permanent or get loaded each time you log in, just add those lines to <span class="emphasis"><em>.bashrc</em></span> file.</p>
       
   446 <div class="section" title="5.1.Further Reading:">
       
   447 <div class="titlepage"><div><div><h3 class="title">
       
   448 <a name="id2699524"></a>5.1.Further Reading:</h3></div></div></div>
       
   449 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   450 <li class="listitem" style="list-style-type: *">
       
   451 <p id="ch11Section_5_42"></p>
       
   452 <div class="reference">
       
   453 <div class="titlepage"><hr /></div>http://lowfatlinux.com/linux-environment-variables.html</div>
       
   454 </li>
       
   455 <li class="listitem" style="list-style-type: *">
       
   456 <p id="ch11Section_5_43"></p>
       
   457 <div class="reference">
       
   458 <div class="titlepage"><hr /></div>http://www.codecoffee.com/tipsforlinux/articles/030.html</div>
       
   459 </li>
       
   460 <li class="listitem" style="list-style-type: *">
       
   461 <p id="ch11Section_5_44"></p>
       
   462 <div class="reference">
       
   463 <div class="titlepage"><hr /></div>http://www.ee.surrey.ac.uk/Teaching/Unix/unix8.html</div>
       
   464 </li>
       
   465 <li class="listitem" style="list-style-type: *">
       
   466 <p id="ch11Section_5_45"></p>
       
   467 <div class="reference">
       
   468 <div class="titlepage"><hr /></div>http://en.wikipedia.org/wiki/Environment_variable</div>
       
   469 </li>
       
   470 </ul></div>
       
   471 </div>
       
   472 </div>
       
   473 <div class="section" title="6.Shell Scripting:">
       
   474 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
       
   475 <a name="id2699578"></a>6.Shell Scripting:</h2></div></div></div>
       
   476 <div class="section" title="6.1.Basics:">
       
   477 <div class="titlepage"><div><div><h3 class="title">
       
   478 <a name="id2699586"></a>6.1.Basics:</h3></div></div></div>
       
   479 <p id="ch11Section_5_46">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 <span class="emphasis"><em>"Hello World"</em></span> sample for shell scripting is as easy as it sounds:</p>
       
   480 <pre class="programlisting">
       
   481 $ echo '#!/bin/sh' &gt; my-script.sh
       
   482 $ clear &gt;&gt; my-script.sh
       
   483 $ echo 'echo Hello World' &gt;&gt; my-script.sh
       
   484 $ chmod 755 my-script.sh
       
   485 $ ./my-script.sh
       
   486 Hello World</pre>
       
   487 <p id="ch11Section_5_47">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, <span class="emphasis"><em>clear</em></span> and <span class="emphasis"><em>echo</em></span> one after another. One can also do the same task using a one liner command <span class="emphasis"><em>clear; echo 'Hello World';</em></span> but as number of lines grows using a script file is helpful.</p>
       
   488 <p id="ch11Section_5_48">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 <span class="emphasis"><em>initial.sh</em></span>, open it with text editor, and write:</p>
       
   489 <pre class="programlisting">
       
   490 #!/bin/sh
       
   491 ls &gt; temp
       
   492 grep ^$1 &lt; temp
       
   493 rm temp
       
   494 $ chmod a+x initial.sh
       
   495 $ ./initial.sh s</pre>
       
   496 <p id="ch11Section_5_49">The $1 in the script is pertaining to command line argument. All arguments passed via command line are accessed via <span class="emphasis"><em>$#</em></span> 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:</p>
       
   497 <pre class="programlisting">
       
   498 #!/bin/sh
       
   499 name=`find . -name $1 -print`
       
   500 echo $name
       
   501 last_modified=`stat -c %y $name| cut -f 1 -d " "`
       
   502 echo "Last modified: $last_modified"
       
   503 $ ./search.sh fname</pre>
       
   504 <p id="ch11Section_5_4a">Try giving some file you want to search in place of fname. Please note in second line <span class="emphasis"><em>`</em></span> 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 (UDV) which stores the value. We access value stored in any variable using <span class="emphasis"><em>$</em></span> symbol before name of variable.</p>
       
   505 <p id="ch11Section_5_4b">naming conventions for variables?? do we need them??</p>
       
   506 </div>
       
   507 <div class="section" title="6.2.Shell Arithmetic:">
       
   508 <div class="titlepage"><div><div><h3 class="title">
       
   509 <a name="id2697944"></a>6.2.Shell Arithmetic:</h3></div></div></div>
       
   510 <p id="ch11Section_5_4c">Shell also provides support for basic arithmetic operations. The syntax is:</p>
       
   511 <pre class="programlisting">
       
   512 $ expr op1 math-operator op2</pre>
       
   513 <p id="ch11Section_5_4d">Some of example which can be tried handily:</p>
       
   514 <pre class="programlisting">
       
   515 $ expr -3 + 5
       
   516 2
       
   517 $ expr 10 % 3
       
   518 1</pre>
       
   519 <p id="ch11Section_5_4e">These spaces in between operator and operands is important, without them shell interpreter will raise the syntax error.</p>
       
   520 <pre class="programlisting">
       
   521 $ expr 2*3
       
   522 expr: syntax error</pre>
       
   523 <p id="ch11Section_5_4f">One can use back-quotes(`) also to get value of expr.</p>
       
   524 <pre class="programlisting">
       
   525 $ echo `expr 6 + 3`
       
   526 9
       
   527 $ result=`expr 6 + 3`
       
   528 $ echo $result
       
   529 9</pre>
       
   530 <p id="ch11Section_5_50">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.</p>
       
   531 <pre class="programlisting">
       
   532 $ echo "Today is date"
       
   533 Today is date
       
   534 $ echo "Today is `date`"
       
   535 Today is Wed Sep 16 17:32:22 IST 2009
       
   536 $ echo 'Today is `date`'
       
   537 Today is `date`
       
   538 $ echo "Today is  n `date`"
       
   539 Today is  n Wed Sep 16 17:40:13 IST 2009
       
   540 $ echo -e "Today is  n `date`"
       
   541 Today is
       
   542  Wed Sep 16 17:41:13 IST 2009</pre>
       
   543 </div>
       
   544 <div class="section" title="6.3.if else construct:">
       
   545 <div class="titlepage"><div><div><h3 class="title">
       
   546 <a name="id2699963"></a>6.3.if else construct:</h3></div></div></div>
       
   547 <p id="ch11Section_5_51">One can have simple <span class="emphasis"><em>if else if</em></span> 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:</p>
       
   548 <pre class="programlisting">
       
   549 #!/bin/sh
       
   550 if test $1 -gt 0
       
   551 then
       
   552   echo "number is positive"
       
   553 else
       
   554   echo "number is negative"
       
   555 fi
       
   556 $ ./sign.sh -11
       
   557 number is negative</pre>
       
   558 <p id="ch11Section_5_52">This script will compare the first value passed as argument with 0 <span class="emphasis"><em>if test var -gt val</em></span>, 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 <span class="emphasis"><em>if-else</em></span> clause which will warn user of correct usage of script.</p>
       
   559 <pre class="programlisting">
       
   560 #this is the case when no argument is passed
       
   561 if [ $# -eq 0 ]
       
   562 then
       
   563   echo "$0 : You must give/supply one integers"
       
   564   exit 1
       
   565 else
       
   566   if [ $# -gt 1 ]
       
   567   then
       
   568     echo "$0 : You must give one integer"
       
   569     exit 1
       
   570   fi
       
   571 fi</pre>
       
   572 <p id="ch11Section_5_53">One important thing to not 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 <span class="emphasis"><em>[ $# -eq 0 ]</em></span> will work properly, but if we remove those leading or trailing spaces like <span class="emphasis"><em>[ $# -eq 0]</em></span>, it wont work as expected, or rather throw a warning. Both <span class="emphasis"><em>test</em></span> and <span class="emphasis"><em>[]</em></span> do the same task of testing a expression and returning true or false.</p>
       
   573 <p id="ch11Section_5_54">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 <span class="emphasis"><em>.bashrc</em></span> file with <span class="emphasis"><em>./greet.sh</em></span> line and we are done. The script is:</p>
       
   574 <pre class="programlisting">
       
   575 #!/bin/sh
       
   576 #Script to greet the user according to time of day
       
   577 temph=`date | cut -c12-13`
       
   578 dat=`date +"%A %d in %B of %Y (%r)"`
       
   579 if [ $temph -lt 12 ]
       
   580 then
       
   581   mess="Good Morning $LOGNAME, Have a nice day!"
       
   582 fi
       
   583 
       
   584 if [ $temph -gt 12 -a $temph -le 16 ]
       
   585 then
       
   586   mess="Good Afternoon $LOGNAME"
       
   587 fi
       
   588 
       
   589 if [ $temph -gt 16 -a $temph -le 18 ]
       
   590 then
       
   591   mess="Good Evening $LOGNAME"
       
   592 fi
       
   593 echo -e "$mess nThis is $dat"</pre>
       
   594 <p id="ch11Section_5_55">For me when I open the shell the output is something like:</p>
       
   595 <pre class="programlisting">
       
   596 Good Morning baali, Have a nice day!
       
   597 This is Wednesday 16 in September of 2009 (11:54:47 AM IST)</pre>
       
   598 </div>
       
   599 <div class="section" title="6.4.Loops">
       
   600 <div class="titlepage"><div><div><h3 class="title">
       
   601 <a name="id2700069"></a>6.4.Loops</h3></div></div></div>
       
   602 <p id="ch11Section_5_56">Bash has three different commands for looping -- <code class="literal">for</code>, <code class="literal">while</code> and <code class="literal">until</code>.</p>
       
   603 <div class="section" title="6.4.1.for loop">
       
   604 <div class="titlepage"><div><div><h4 class="title">
       
   605 <a name="id2700092"></a>6.4.1.<code class="literal">for</code> loop</h4></div></div></div>
       
   606 <p id="ch11Section_5_57">Suppose we have a set of files, that have names beginning with numbers followed by their names - <code class="literal">08 - Society.mp3</code>. 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 <code class="literal">for</code> loop, to loop through the list of files and rename each of the files.</p>
       
   607 <p id="ch11Section_5_58">Let's first look at a simple <code class="literal">for</code> loop, to understand how it works.</p>
       
   608 <pre class="programlisting">
       
   609 for animal in rat cat dog man
       
   610 do
       
   611   echo $animal
       
   612 done</pre>
       
   613 <p id="ch11Section_5_59">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 <code class="literal">animal</code> is a dummy variable and has no significance. You could use something as lame as <code class="literal">i</code> in place of <code class="literal">animal</code>.</p>
       
   614 <p id="ch11Section_5_5a">Now, we use a simple <code class="literal">for</code> loop to list the files that we are interested in.</p>
       
   615 <pre class="programlisting">
       
   616 ls *.mp3 &gt; list
       
   617 for i in `cat list`
       
   618 do
       
   619   echo "$i"
       
   620 done</pre>
       
   621 <p id="ch11Section_5_5b">If your filenames contain spaces, <code class="literal">for</code> 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.</p>
       
   622 <pre class="programlisting">
       
   623 for i in *.mp3
       
   624 do
       
   625   echo "$i"
       
   626 done</pre>
       
   627 <p id="ch11Section_5_5c">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.</p>
       
   628 <pre class="programlisting">
       
   629 for i in *.mp3
       
   630 do
       
   631   j=$(echo "$i"|grep -o "[A-Za-z'&amp;. ]*.mp3")
       
   632   echo "$i -&gt; $j"
       
   633 done</pre>
       
   634 <p id="ch11Section_5_5d">Now we just replace the echo command with a <code class="literal">mv</code> or a <code class="literal">cp</code> command.</p>
       
   635 <pre class="programlisting">
       
   636 for i in *.mp3
       
   637 do
       
   638   j=$(echo "$i"|grep -o "[A-Za-z'&amp;. ]*.mp3")
       
   639   cp "$i" "$j"
       
   640 done</pre>
       
   641 <p id="ch11Section_5_5e">As an exercise, you could try sorting the files in reverse alphabetical order and then prefix numbers to each of the filenames.</p>
       
   642 </div>
       
   643 <div class="section" title="6.4.2.while">
       
   644 <div class="titlepage"><div><div><h4 class="title">
       
   645 <a name="id2700210"></a>6.4.2.<code class="literal">while</code>
       
   646 </h4></div></div></div>
       
   647 <p id="ch11Section_5_5f">The <code class="literal">while</code> command allows us to continuously execute a block of commands until the command that is controlling the loop is executing successfully.</p>
       
   648 <p id="ch11Section_5_60">Let's start with the lamest example of a while loop.</p>
       
   649 <pre class="programlisting">
       
   650 while true
       
   651 do
       
   652   echo "True"
       
   653 done</pre>
       
   654 <p id="ch11Section_5_61">This, as you can see, is an infinite loop that prints the <code class="literal">True</code>.</p>
       
   655 <p id="ch11Section_5_62">Say we wish to write a simple program that takes user input and prints it back, until the input is <code class="literal">quit</code>, which quits the program.</p>
       
   656 <pre class="programlisting">
       
   657 while [ "$variable" != "quit" ]
       
   658 do
       
   659   read variable
       
   660   echo "Input - $variable"
       
   661 done
       
   662 exit 0</pre>
       
   663 </div>
       
   664 <div class="section" title="6.4.3.until">
       
   665 <div class="titlepage"><div><div><h4 class="title">
       
   666 <a name="id2700260"></a>6.4.3.<code class="literal">until</code>
       
   667 </h4></div></div></div>
       
   668 <p id="ch11Section_5_63">The <code class="literal">until</code> loop is similar to the <code class="literal">while</code> loop, except that it executes until the conditional command does not execute properly.</p>
       
   669 <p id="ch11Section_5_64">The infinite loop changes to the following, when <code class="literal">until</code> is used.</p>
       
   670 <pre class="programlisting">
       
   671 until false
       
   672 do
       
   673   echo "True"
       
   674 done</pre>
       
   675 <p id="ch11Section_5_65">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</p>
       
   676 <pre class="programlisting">
       
   677 #!/bin/sh
       
   678 
       
   679 #To check number of arguments being passed.
       
   680 if [ $# -eq 0 ] ; then
       
   681 echo "Correct usage: $0 tar-archive filename  nOr $0 filename"
       
   682 exit 1
       
   683 else
       
   684   if [ $# -eq 1 ] ; then
       
   685     tar_archive=`find $PWD -name "*.tar*"`
       
   686   else
       
   687     tar_archive=`find $PWD -name $1`
       
   688   fi
       
   689 fi
       
   690 
       
   691 #Search of particular file inside archives.
       
   692 for archive in $tar_archive
       
   693 do
       
   694   echo $archive
       
   695   variable=`tar -tf $archive`
       
   696   for word in $variable
       
   697   do
       
   698     if [ $# -eq 1 ] ; then
       
   699       echo "$word" | grep -q ".*$1"
       
   700     else
       
   701       echo "$word" | grep -q ".*$2"
       
   702     fi
       
   703   if [ $? -eq 0 ] ; then
       
   704     echo "File present in $archive!"
       
   705   fi
       
   706   done
       
   707 done</pre>
       
   708 </div>
       
   709 </div>
       
   710 <div class="section" title="6.5.Functions">
       
   711 <div class="titlepage"><div><div><h3 class="title">
       
   712 <a name="id2700315"></a>6.5.Functions</h3></div></div></div>
       
   713 <p id="ch11Section_5_66">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, <code class="literal">hello-world</code>. Functions can be defined in bash, either using the <code class="literal">function</code> built-in followed by the function name or just the function name followed by a pair of parentheses.</p>
       
   714 <pre class="programlisting">
       
   715 function hello-world
       
   716 {
       
   717 echo "Hello, World.";
       
   718 }
       
   719 
       
   720 hello-world () {
       
   721   echo "Hello, World.";
       
   722 }
       
   723 
       
   724 $ hello-world
       
   725 Hello, World.</pre>
       
   726 <p id="ch11Section_5_67">Passing parameters to functions is similar to passing them to scripts.</p>
       
   727 <pre class="programlisting">
       
   728 function hello-name
       
   729 {
       
   730 echo "Hello, $1.";
       
   731 }
       
   732 
       
   733 $ hello-name 9
       
   734 Hello, 9.</pre>
       
   735 <p id="ch11Section_5_68">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 <code class="literal">local</code> built-in command of bash.</p>
       
   736 <p id="ch11Section_5_69">We shall now write a function for the word frequency generating script that we had looked at in the previous session.</p>
       
   737 <pre class="programlisting">
       
   738 function word_frequency {
       
   739   if [ $# -ne 1 ]
       
   740   then
       
   741     echo "Usage: $0 file_name"
       
   742     exit 1
       
   743   else
       
   744     if [ -f "$1" ]
       
   745     then
       
   746       grep  "[A-Za-z]*" -o "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | less
       
   747     fi
       
   748   fi
       
   749 }</pre>
       
   750 <p id="ch11Section_5_6a">As an exercise, modify the function to accept the input for the number of top frequency words to be shown (if none is given, assume 10).</p>
       
   751 </div>
       
   752 <div class="section" title="6.6.Further Reading:">
       
   753 <div class="titlepage"><div><div><h3 class="title">
       
   754 <a name="id2700386"></a>6.6.Further Reading:</h3></div></div></div>
       
   755 <div class="itemizedlist"><ul class="itemizedlist" type="*">
       
   756 <li class="listitem" style="list-style-type: *">
       
   757 <p id="ch11Section_5_6b"></p>
       
   758 <div class="reference">
       
   759 <div class="titlepage"><hr /></div>http://www.freeos.com/guides/lsst/</div>
       
   760 </li>
       
   761 <li class="listitem" style="list-style-type: *">
       
   762 <p id="ch11Section_5_6c"></p>
       
   763 <div class="reference">
       
   764 <div class="titlepage"><hr /></div>http://bash.cyberciti.biz/guide/Main_Page</div>
       
   765 </li>
       
   766 <li class="listitem" style="list-style-type: *">
       
   767 <p id="ch11Section_5_6d"></p>
       
   768 <div class="reference">
       
   769 <div class="titlepage"><hr /></div>http://tldp.org/LDP/abs/html/</div>
       
   770 </li>
       
   771 <li class="listitem" style="list-style-type: *">
       
   772 <p id="ch11Section_5_6e"></p>
       
   773 <div class="reference">
       
   774 <div class="titlepage"><hr /></div>http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html</div>
       
   775 </li>
       
   776 </ul></div>
       
   777 </div>
       
   778 </div>
       
   779 </div>
       
   780 </div></body>
       
   781 </html>
       
   782