On Thu, Jul 17, 2008 at 11:12:47PM +0000, Poor Yorick wrote:
> To get rid of null elements in an array, I currently do something like this:
>
> bash-3.2$ var1=("with spaces" "more spaces" '' "the end")
> bash-3.2$ for v in "[EMAIL PROTECTED]"; do if test "$v"; then
> var2+=("$v"); fi; done
> bash-3.2$ echo [EMAIL PROTECTED]
> 3
> bash-3.2$ printf '%s\n' "[EMAIL PROTECTED]"
> with spaces
> more spaces
> the end
[...]
A note though: bash arrays are more associative arrays (with
keys limited to positive integers) more than arrays.
If you have a bash array with:
12 => ""
123 => foo
3456 => bar
Your method will turn it into:
0 => foo
1 => bar
With recent versions of bash, you could do:
for i in "[EMAIL PROTECTED]"; do
[ -n "${var1[$i]}" ] || unset "var1[$i]"
done
For comparison,
In zsh, arrays are arrays, and there is a difference variable
type for associative arrays (whose keys are not limited to
integers).
In zsh, removing the empty elements is just a matter of
var1=($var1)
because $var1 expands to the list of non-empty elements in the
array by default (you need "[EMAIL PROTECTED]" to include the empty
ones).
In zsh,
a[3]=foo
on an empty array is the same as
a=("" "" foo)
And with an associative array such as:
typeset -A h
h[foo]=bar
h[empty]=""
To remove the empty ones:
h=("${(kv@)h[(R)?*]}")
for instance.
--
Stéphane