old-www/LDP/LG/issue57/tag/4.html

207 lines
7.3 KiB
HTML

<!--startcut ======================================================= -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<META NAME="generator" CONTENT="lgazmail v1.3E.d">
<TITLE>The Answer Gang 57: shell script</TITLE>
</HEAD><BODY BGCOLOR="#FFFFFF" TEXT="#000000"
LINK="#3366FF" VLINK="#A000A0">
<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<P> <hr>
<CENTER>
<!-- *** BEGIN navbar *** -->
<!-- *** END navbar *** -->
</CENTER>
</p>
<P> <hr> <P>
<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
<center>
<H1><A NAME="answer">
<img src="../../gx/dennis/qbubble.gif" alt="(?)"
border="0" align="middle">
<font color="#B03060">The Answer Gang</font>
<img src="../../gx/dennis/bbubble.gif" alt="(!)"
border="0" align="middle">
</A></H1>
<BR>
<H4>By James T. Dennis,
<a href="mailto:linux-questions-only@ssc.com">linux-questions-only@ssc.com</a><BR>
LinuxCare,
<A HREF="http://www.linuxcare.com/">http://www.linuxcare.com/</A>
</H4>
</center>
<p><hr><p>
<!-- endcut ======================================================= -->
<!-- begin 4 -->
<H3 align="left"><img src="../../gx/dennis/qbubble.gif"
height="50" width="60" alt="(?) " border="0"
>shell script</H3>
<p><strong>From Peter Truong on Mon, 28 Aug 2000
</strong></p>
<p align="right">Answered By: Ben Okopnik</p>
<P><STRONG><IMG SRC="../../gx/dennis/qbub.gif" ALT="(?)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
I have a directory consisting of:
</STRONG></P>
<pre><strong>
test01.in test05.in test99.in &lt;-- in files
test01.out test05.out test99.out &lt;-- out files
</strong></pre>
<P><STRONG>
this is my code:
</STRONG></P>
<Pre><STRONG>
infile=`test[0-9][0-9]*.in`
outfile=`test[0-9][0-9]*.out`
</STRONG></Pre>
<BLOCKQUOTE><IMG SRC="../../gx/dennis/bbub.gif" ALT="(!)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
This is at least one of the reasons it doesn't work. What you seem to
be trying to do here is create a list of files under the "$infile" and
"$outfile" labels <TT>-</TT> but by putting the right side of the equation in
backquotes, you're asking the shell to _execute_ it. That won't work;
in fact, you should get an error message when you run this.
</BLOCKQUOTE>
<Pre><STRONG><IMG SRC="../../gx/dennis/qbub.gif" ALT="(?)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
for input in $infile
do
for output in $outfile
a.out &lt; $input &gt; $output
</STRONG></Pre>
<BLOCKQUOTE><IMG SRC="../../gx/dennis/bbub.gif" ALT="(!)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
What this will do is execute "a.out" and use the current value of "$input"
as the file for it to process, then output the result into the filename
that is the current value of "$output" (overwriting whatever was in there
originally). You didn't mention this part of the script in your explanation
of what you want the script to do, but this _will_ wreck your "*.out"
files. This "double" loop will also repeat the above process as many times
as there are output files (if the original "list of files" equation worked)
for <EM>each</EM> input file, i.e., if you have 50 "*.in/*.out" pairs, the inside
loop will execute 2500 times <TT>-</TT> and the end result will be the "processed"
value of the last file in the "input" list written to every file in the
"output" list.
</BLOCKQUOTE>
<Pre><STRONG><IMG SRC="../../gx/dennis/qbub.gif" ALT="(?)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
cmp $input $output
</STRONG></Pre>
<BLOCKQUOTE><IMG SRC="../../gx/dennis/bbub.gif" ALT="(!)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
This part, of course, becomes useless after the above procedure: either
"a.out" changes "$input", in which case it will always be different, or
it does not change it, in which case it will always be identical.
</BLOCKQUOTE>
<Pre><STRONG><IMG SRC="../../gx/dennis/qbub.gif" ALT="(?)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
echo $?
done
</STRONG></Pre>
<P><STRONG>
but this however, doesn't work.
what I want it to do is:
</STRONG></P>
<P><STRONG>
<ul>
<li> get each of the individual pairs of files (ie. test01.in &amp; test02.out)
<li> and compare each pair until there is no more to compare.
</ul></STRONG></P>
<BLOCKQUOTE><IMG SRC="../../gx/dennis/bbub.gif" ALT="(!)"
HEIGHT="28" WIDTH="50" BORDER="0"
>
All right; try this -
</BLOCKQUOTE>
<BLOCKQUOTE><pre>
--------------------------------------------------------------------
#!/bin/bash
#
# "in_out" - compares all &lt;fname&gt;.in to &lt;fname&gt;.out files in the
# current directory
for n in *.in
do
cmp $n $(basename $n in)out
done
--------------------------------------------------------------------
</pre></BLOCKQUOTE>
<BLOCKQUOTE>
It's basic, but worth repeating: the "hash-bang" line comes first in any
shell script and must be contiguous (no spaces). If the script requires
input, write an error-checking routine and print usage instructions on an
error; otherwise, as in this one, comments will help you remember what it
does (you may remember it today, but not 3 years and 1,000 scripts down the
road.) Next, the loop <TT>-</TT> for each "in" file, we generate the "out" filenames
via "basename", by chopping off the "in" extension and tacking on an "out".
Then we perform the comparison and print a message for every pair that
fails: "cmp" exits silently on a "good" comparison, and prints a message on
a bad one. If you want numeric output, you can use "cmp <TT>-s</TT>" (for "silent"
output, i.e., it only sets the status flag) and "$?" to print the status
value.
</BLOCKQUOTE>
<BLOCKQUOTE>
Good luck with your shell-scripting,
<br>Ben Okopnik
</BLOCKQUOTE>
<!-- sig -->
<!-- end 4 -->
<!--startcut ======================================================= -->
<P> <hr> </p>
<H5 align="center"><a href="http://www.linuxgazette.com/copying.html"
>Copyright &copy;</a> 2000, James T. Dennis
<BR>Published in the <I>Linux Gazette</I> Issue 57 September 2000</H5>
<H6 ALIGN="center">HTML transformation by
<A HREF="mailto:star@tuxtops.com">Heather Stern</a> of
Tuxtops, Inc.,
<A HREF="http://www.tuxtops.com/">http://www.tuxtops.com/</A>
</H6>
<P> <hr>
<!-- begin tagnav ::::::::::::::::::::::::::::::::::::::::::::::::::-->
<p align="center">
<table width="100%" border="0"><tr>
<td align="right" valign="center"
><IMG ALT="" SRC="../../gx/navbar/left.jpg"
WIDTH="14" HEIGHT="45" BORDER="0" ALIGN="middle" border="0">
<A HREF="../lg_answer57.html"
><IMG SRC="../../gx/dennis/answertoc.jpg" align="middle"
ALT="[ Answer Guy Current Index ]" border="0"></A></td>
<td align="center" valign="center"><A HREF="../lg_answer57.html#greeting"><img align="middle"
src="../../gx/dennis/smily.gif" alt="greetings" border="0"></A> &nbsp;
<A HREF="1.html">1</A> &nbsp;
<A HREF="2.html">2</A> &nbsp;
<A HREF="3.html">3</A> &nbsp;
<A HREF="4.html">4</A> &nbsp;
<A HREF="5.html">5</A> &nbsp;
<A HREF="6.html">6</A> &nbsp;
<A HREF="7.html">7</A></td>
<td align="left" valign="center"><A HREF="../../tag/kb.html"
><IMG SRC="../../gx/dennis/answerpast.jpg" align="middle"
ALT="[ Index of Past Answers ]" border="0"></A>
<IMG ALT="" SRC="../../gx/navbar/right.jpg" align="middle"
WIDTH="14" HEIGHT="45" BORDER="0"></td></tr></table>
</p>
<!-- end tagnav ::::::::::::::::::::::::::::::::::::::::::::::::::::-->
<P> <hr>
<CENTER>
<!-- *** BEGIN navbar *** -->
<!-- *** END navbar *** -->
</CENTER>
</p>
<!-- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -->
</BODY></HTML>
<!--endcut ========================================================= -->