Bourne variable unset outside while()

Arthur Chance freebsd at
Fri May 9 15:05:02 UTC 2014

On 09/05/2014 15:45, Polytropon wrote:
> On Fri, 9 May 2014 06:42:45 +0000, Ivailo A. Tanusheff wrote:
>> Hi,
>> I think you can check out this:
>> So I sugest you do the same trick or use different approach - awk or something like this.
> This actually works (and is a good idea to get rid of my suggested
> `awk ...` call per each line of input). In "here documents", variable
> expansion can be used. If the input will be coming from a file
> instead, using < /the/file can be done.
> 	#!/bin/sh
> 	fs="freebsd-ufs gprootfs 1G
> 	freebsd-swap gpswapfs 1G
> 	freebsd-ufs gpvarfs 1G"
> 	while read -r fstype fslabel fssize; do
> 	        labels="${labels} ${fslabel}"
> 	done << EOF
> 	"${fs}"
> 	EOF
> 	echo "labels = ${labels}"
> The result is:
> 	labels =  gprootfs gpswapfs gpvarfs
> There's a leading space because at the first addition, ${labels}
> is empty, a space and the 1st entry are then added. The awk approach
> didn't have that "bug", erm... feature. ;-)

You can avoid that leading space by using yet another obscure bit of 
shell programming. Make the loop body

	labels="${labels}${labels:+ }${fslabel}"

The variable expansion ${foo:+bar} is empty if ${foo} is empty or unset, 
and "bar" is ${foo} is set and non-empty. Also useful in things like

somecmd ${outfile:+-o} ${outfile} args ...

More information about the freebsd-questions mailing list