On Sun, Feb 17, 2019 at 08:07:06PM -0500, Chet Ramey wrote:
> On 2/16/19 11:38 AM, sunnycemet...@gmail.com wrote:
> > I would like to include a null string as part of a parameter expansion word:
> > 
> >> mapfile -t${bNullDelimited+d ''}
> > 
> > When bNullDelimited is set, I expect this to expand to:
> > 
> >> mapfile -td ''
> > 
> > However, it expands to:
> > 
> >> mapfile -td
> 
> There are mixed behaviors. The idea behind the bash behavior is that a
> null string added to a non-empty word is simply discarded, and this happens
> while the word after the `+' is being processed, before word splitting.
> 
> bash/ksh93/zsh do it one way, ash-derived shells/mksh/yash do it another.

Ugh.  Shells are so messy.

wooledg:~$ ksh
$ args ${PATH+d ''}
1 args: <d>

wooledg:~$ dash
$ args ${PATH+d ''}
2 args: <d> <>

Looks like the best workaround (for bash/ksh) is to store the -d '' args
in an array, and use something like:

mapfile -t ${bNullDelimited+"${tmparray[@]}"}

This works in both ksh and bash; I did not test anything else (and of
course dash and other close-to-POSIX shells don't even *have* arrays, so
it's a good thing the workaround isn't needed there).

Then again, mapfile is bash-only, so you probably aren't looking for a
great level of portability here.

Reply via email to