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-de...@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. ------------------------------------------------------------------------ _______________________________________________ Server-devel mailing list server-de...@lists.laptop.org http://lists.laptop.org/listinfo/server-devel