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

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


Hi Martin,

Perhaps:

=========================================
#!/bin/bash -x

[ -n "$DEBUG" ] && set -o xtrace

declare -a inparms

declare -i i=0
while true; do
  inparms[$i]="${1/\"/\\\"}"
  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.
------------------------------------------------------------------------





More information about the Devel mailing list