Bourne variable unset outside while()
Arthur Chance
freebsd at qeng-ho.org
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:
>> http://stackoverflow.com/questions/7482510/variable-incrementing-in-bash
>>
>> 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