Bourne variable unset outside while()

Polytropon freebsd at
Thu May 8 20:55:08 UTC 2014

On Thu, 8 May 2014 14:48:22 -0400, Rick Miller wrote:
> Hi all,
> I have a Bourne shell script that echoes the contents of a data structure
> to a while() loop that iterates over the data and is expected to append a
> string from the current iteration to a different list.  Inside the while(),
> it works fine, but echo'ing the list outside the loop produces empty
> output.  I expect the variable to maintain it's final state after
> processing the while(), but it does not appear to be doing so.
> /** The script **/
> #! /bin/sh -x
> fs="freebsd-ufs gprootfs 1G
> freebsd-swap gpswapfs 1G
> freebsd-ufs gpvarfs 1G";
> echo "${fs}" |
> while read -r fstype fslabel fssize; do
>         labels="${labels} ${fslabel}";
>         echo "${labels}";
> done
> echo -e "\nlabels = ${labels}";
> /** End the script **/
> The output from this script is at
> This almost appears to be an issue with scope, but I've not encountered
> this before, especially in such simple context.  I must be missing
> something obvious and just looking for feedback to send me off in the right
> direction.

You have identified the problem: With the | redirector, a subshell
is started which populates ${labels}, but at the "higher" level
${labels} keeps its setting (in this case, implicit empty string).

Here's a workaround, using awk:


	fs="freebsd-ufs gprootfs 1G
	freebsd-swap gpswapfs 1G
	freebsd-ufs gpvarfs 1G"

	labels=`echo "${fs}" | awk '{printf("%s ", $2);}'`
	echo "labels = ${labels}"

In this example, with `...`, which is the same as $(...), also
starts a subshell, but assigns its output to a variable, so there
will be no scope problem. This idea uses the advantage that your
delimiter is newline, and awk can process the input line per line,
printing "incomplete lines" (no newline added) as output.

The result will be:

	labels = gprootfs gpswapfs gpvarfs

Is this what you expected?

Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...

More information about the freebsd-questions mailing list