This is the mail archive of the cygwin-talk mailing list for the cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: bash scripting nightmare.


Dave Korn wrote:
Hey all, who's any good at bash scripting?

  I've been trying for two-and-a-half hours now to make a fairly simple shell
script work, and I've been through every imaginable combination of quoting,
and nothing I've tried works.  The bash FAQ doesn't have anything to say on
the matter, nor could I figure it out from the Advanced Bash-Scripting Guide.

  I'm not a proud man, so I don't mind begging for help.  The trouble is that
I want to:

a) declare a variable which contains the date in ANSI format, then b) concatenate that variable and a few others into another variable, then
c) pass that other variable to a function, then finally
d) invoke the command line specified in the variable within the function.


  Sounds easy, you think?  Not quite.  There's a catch: the date string
contains a space in it.  And I can't find any way at all to get that date
string passed to the command line from within the function without that space
breaking things totally.  If I don't try and quote it, the time part of the
datestamp is taken as a separate command line argument and cvs doesn't
understand it.  If I do try and quote it, bash mangles the variable into
gibberish.  Let me demonstrate:
[snip examples]

It sounds like you want to read up on arrays and "$@" (quotes included).


Here is a guess:

> a) declare a variable which contains the date in ANSI format

MY_DATE="`data <format>`"

> b) concatenate that variable and a few others into another variable

Don't do this. Pass in multiple parameters instead (see below).

> c) pass that other variable to a function, then finally

myFunction "$MY_CMD" "${OPTIONS1[@]}" "$MY_DATE" $OPTIONS2

OPTIONS1 is an array that will be split and passed as positional parameters such that each parameter ($2, $3, etc) is exactly an item in the array. I.e. if the array is {foo, "bar none", cat}, then you will get positional parameters e.g. $2=foo, $3="bar none", $4=cat. OPTIONS2 will be split as usual, i.e. each word will be a positional parameter.

Obviously, you could make OPTION2 an array, or OPTION1 flat, or omit one or both, depending on your needs.

> d) invoke the command line specified in the variable in the function.

echo "Now running '$@':"
"$@"

If you need non-command-line parameters to the function I would pass them in first, copy them to 'local's, and then 'shift'.

Does that help?

--
Matthew
vIMprove your life! Now on version 7!


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]