bourne shell query
Jeff Beadles
jeff at quark.WV.TEK.COM
Fri Aug 31 00:55:44 AEST 1990
fred at maccs.dcss.mcmaster.ca (Fred Whiteside) writes:
:>
:> i have a simple little shell question. I am attempting
:>to write a script that will perform various manipulations on news
:>articles. my problem seems to be with understanding variable
:>substitution in sh. a minimal example is the enclosed sh script. what
:>it should do is set the variable files to be the names of those
:>articles in comp.std.c whose name (article number) is greater than or
:>equal to the numeric value of the scripts first argument. this does
:>not behave as expected. i have tried quite a unmber of variations on
:>this theme (mostly centering around multiple $'s and interesting
:>quoting of commands, but i tend to get all of the files or none of them
:>depending on (for some reason) the number of $'s preceding the zots
:>variable name (also on the number in front of the 1, $1 or $$1, etc.
:>but i expected that ...) this is running under sunos4.1 if that is
:>interesting. i have tried to read the manual, but with little
:>success. anyone interested in pointing out my clear stupidity
:>publicly? i *would* appreciate it ....
:>
:> many thanks ...
:>
:>#!/bin/sh
:>cd /usr/spool/news/comp/std/c
:>zots=$1
:>echo "Should ignore files with name < $zots"
:>files=`ls -rt * |grep -v '.*[a-zA-Z].*' | awk $1 '>=' $zots {print}`
I see a quoting problem here ^^^^^^^^^^^^^^^^^^^^^
:>echo $files
:>
:>--
:>Fred Whiteside Chedoke-McMaster Hospitals, Hamilton, Ontario, Canada
:>whitesid@{mcmaster.ca,darwin.cmh.mcmaster.ca,130.113.2.18}
:>fred at maccs.DCSS.McMaster.CA ...!uunet!utai!utgpu!maccs!fred
>files=`ls -rt * |grep -v '.*[a-zA-Z].*' | awk $1 '>=' $zots {print}`
This line is the problem, replace it with:
files=`ls -rt * |grep -v '.*[a-zA-Z].*' | awk "\$1 >= $zots {print}"`
Or, to make it a little more simpler... (You don't need .*'s in the grep)
files=`ls -rt * |grep -v '[a-zA-Z]' | awk "\$1 >= $zots {print}"`
To explain:
The only real change was to change thw quoting around the awk script.
$1 was getting expanded to the shell's $1, not the 1st awk field.
By using " as a quoting character, the shell is able to expand $zot to whatever
number it represents. The \$1 is to prevent the shell from trying to expand $1
to the shell's $1, rather than the 1st awk field.
After the shell is finished with variable substitution,
awk "\$1 >= $zots {print}"
is transformed, and awk see's: (if zot = 10)
awk "$1 >= 10 {print}"
Hope this helps! A decent book on shell programming and quoting is the Howard
Sam's book on shell programming.
-Jeff
--
Jeff Beadles jeff at quark.WV.TEK.COM
Utek Engineering, Tektronix Inc. +1 503 685 2568
SPEEA - Just say no.
More information about the Comp.unix.shell
mailing list