[Server-devel] Fixing bash script bogosity - help?

Andrew McMillan andrew at morphoss.com
Tue Apr 28 07:41:28 EDT 2009


On Tue, 2009-04-28 at 23:25 +1200, Andrew McMillan wrote:
> Hi Martin,
> 
> Perhaps:
> 
> =========================================
> #!/bin/bash -x
> 
> [ -n "$DEBUG" ] && set -o xtrace
> 
> declare -a inparms
> 
> declare -i i=0
> while true; do
>   inparms[$i]="${1/\"/\\\"}" 

Sorry, that should have read:

    inparms[$i]="${1//\"/\\\"}"

so that all instances of " were replaced by \", rather than just the
first one :-)

Cheers,
					Andrew.

>   shift || break
>   i=$(( $i + 1 ))
> done
> 
> printargs() {
>   local -i j=0
>   while [ $j -lt $i ] ; do
>     printf ' "%s"' "${inparms[$j]}"
>     j=$(( $j + 1 ))
>   done
> }
> 
> # in the script, the CMD is built up as a string
> CMD="touch `printargs`"
> 
> # in practice we somtimes use /sbin/runuser -c
> # and other times plain bash -c
> bash -c "$CMD"
> 
> =========================================
> 
> Line 9 is an ugly hack, and quite possibly a bashism.
> 
> 
> Hope this is some use,
> 
> 					Andrew McMillan.
> 
> 
> On Mon, 2009-04-27 at 22:37 +0200, Martin Langhoff wrote:
> > Hi all,
> > 
> > I have a simple shell scripting problem :-) you'll find attached a
> > shell script that ships with ejabberd. It is a fairly straightforward
> > bit of code, and allows us to control bits of the ejabberd internals
> > with a nice cli interface. (Feel free to skip the start / stop bits of
> > the code, I'm fighting with the ctrl function.)
> > 
> > The problem it has is that the parameters are passed to a bash or
> > runas invocation -- at which point the quoting is a mess. Currently I
> > am working around it in the caller by doing some stupid
> > nested-quoting. But this should be easy to cure -- if anyone knows a
> > bit more bash (or portable shell!) than me :-)
> > 
> > A minimal exposition of the problem is as follows:
> > 
> > $ cat sample.sh
> > #!/bin/bash -x
> > 
> > # in the script, the CMD is built up as a string
> > CMD="touch $@"
> > # in practice we somtimes use /sbin/runuser -c
> > # and other times plain bash -c
> > bash -c "$CMD"
> > 
> > # this invokation does the wrong thing -
> > $ ./sample.sh ./sample.sh "this is file one" "this is file two"
> > # the ugly workaround is
> > ./sample.sh "'this is file one'" "'this is file two'"
> > 
> > Any hints that don't involve a rewrite?
> > 
> > cheers,
> > 
> > 
> > 
> > martin-who's-easily-stumped-with-shell-backwardnesss
> 
> ------------------------------------------------------------------------
> andrew (AT) morphoss (DOT) com                            +64(272)DEBIAN
>  You will be awarded a medal for disregarding safety in saving someone.
> ------------------------------------------------------------------------
> 
> 
> _______________________________________________
> Server-devel mailing list
> Server-devel at lists.laptop.org
> http://lists.laptop.org/listinfo/server-devel
> 
------------------------------------------------------------------------
andrew (AT) morphoss (DOT) com                            +64(272)DEBIAN
   You have the power to influence all with whom you come in contact.
------------------------------------------------------------------------





More information about the Devel mailing list