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