On 21 April 2015 at 17:48, Eric Blake <ebl...@redhat.com> wrote: > On 04/21/2015 09:55 AM, Peter Maydell wrote: >> If you want pure POSIX shell then it is slightly >> uglier as we have to invoke sed: >> >> argstr="" >> for arg in "$@"; do >> o=$(printf '%s.\n' "$arg" | sed s/,/,,/g) >> argstr=${argstr:+$argstr,}arg=${o%.} >> done > > It's possible to use IFS= and case to avoid the need to fork, while > still writing portable shell, but the solution then takes LOTS more > lines of code, so I'm not even going to bother to try writing it here. > > However, one thing this does NOT handle is an argument that is a literal > ','. That is, if I pass 'a', ',' and 'b' as my arguments, this script > results in $argstr being a,,,,b, which the qemu parser would read as a > single argument of 'a,,b' rather than the three intended arguments.
Hmm? You get "arg=a,arg=,,,arg=b". Does the parser not read that the way I would expect? > In order to handle that, you'd need some sort of solution that requires > an unambiguous separation between arguments. For example, > > --semihosting-options opt=a,,,,b > vs. > --semihosting-options opt=a,opt=,,,opt=b The latter is what the script works with (except 'arg' rather than 'opt'). Incidentally if you have a better idea for achieving the desired goal than this messing around with comma-escaping I would really like to know. I don't like either of the current two proposals very much :-( -- PMM