BASH question

Brandon Sandrowicz bsandrow-Re5JQEeQqe8AvxtiuMwx3w at public.gmane.org
Mon Dec 17 18:54:21 UTC 2007


On 12/15/07, Walter Dnes <waltdnes-SLHPyeZ9y/tg9hUCZPvPmw at public.gmane.org> wrote:
>  Is your inbox fixed, my offline email to you is rejected.
>
> On Sat, Dec 15, 2007 at 06:58:40AM -0500, Madison Kelly wrote
> > David C. Chipman wrote:
> >>      Hi Madi,                Could you do this:
> >> -- Start code ---
> >> for QRY_LINE in $(<some-mysql-cli-command>)
> >> do
> >>      ROW_NUM=$(echo $QRY_LINE | awk '{ print $1 }")
> >>      VAR1=$(echo $QRY_LINE | awk '{ print $2 }')
> >>      VAR2=$(echo $QRY_LINE | awk '{ print $3 }')
> >>      VAR2=$(echo $QRY_LINE | awk '{ print $4 }')
> >>      DATE1=$(echo $QRY_LINE | awk '{ print $5 }')
> >>      TIME=$(echo $QRY_LINE | awk '{ print $6 }')
> >>      DATE2=$(echo $QRY_LINE | awk '{ print $7 }')
> >> done
> >> -- End code --
>
> > Hi David,
> >
> >   The problem I had when ever I tried to do that was ${QRY_LINE} would be
> > the results split on any white space, so every word was a line, regardless
> > of whether it was space, tab or newline seperated... a lot of the (real)
> > data contained one of more words... I need something that would populate
> > the array by splitting on newline and then split the containing data into
> > variables on 'tab'.
>
>  This is default bash behaviour.  If you want entire lines, use the
> built-in shell variable REPLY, which picks up input by line.  Try
> something like...
>
> ./test.sh | ./parse_script
>
> where parse_script is something like
>
> #!/bin/bash
> linecounter=0
> while read
> do
>  linecounter= $(( ${linecounter} + 1 ))
>  dataline=${REPLY}
>  echo "Line number ${linecounter} is... ${dataline}"
> done
>
>  You can then proceed to pick apart the contents of dataline.
>
> Excerpt from "man bash"...
>
> read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d
> delim] [name ...]
>       One line is read from the  standard  input,  or  from  the  file
>       descriptor  fd supplied as an argument to the -u option, and the
>       first word is assigned to the first name, the second word to the
>       second  name, and so on, with leftover words and their interven-
>       ing separators assigned to the last name.  If  there  are  fewer
>       words read from the input stream than names, the remaining names
>       are assigned empty values.  The characters in IFS  are  used  to
>       split  the  line into words.  The backslash character (\) may be
>       used to remove any special meaning for the next  character  read
>       and  for line continuation.  Options, if supplied, have the fol-
>       lowing meanings:
>
> [...snip detailed explanation of options...]
>
>       If no names are supplied, the line read is assigned to the vari-
>       able REPLY.  The return code  is  zero,  unless  end-of-file  is
>       encountered,  read  times  out, or an invalid file descriptor is
>       supplied as the argument to -u.
>
> --
> Walter Dnes <waltdnes-SLHPyeZ9y/tg9hUCZPvPmw at public.gmane.org>
> I'm not repeating myself
> I'm an X Window user...  I'm an ex-Windows-user
> --
> The Toronto Linux Users Group.      Meetings: http://gtalug.org/
> TLUG requests: Linux topics, No HTML, wrap text below 80 columns
> How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists
>

Why have him creating two scripts just to pipe one to the other?

command | while read LINE
do
   do something w/ $LINE
done

The only problem that I've had is that when setting array values
inside of the array, they remain local to the loop for some reason...
even when you declare the array outside of the loop.

--
Brandon Sandrowicz
--
The Toronto Linux Users Group.      Meetings: http://gtalug.org/
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://gtalug.org/wiki/Mailing_lists





More information about the Legacy mailing list