theshell.ch/site/pages/scripts/arrays.html

108 lines
3.7 KiB
HTML
Raw Normal View History

---
layout: page
category-page: scripts
category-title: Scripting
tags: array variable many index selector
author: Marco Tereh
title: Arrays
---
<p>
<!-- add link to page on variables once it exists -->
There is a special kind of <a href="#">variable</a>, called an array.<br>
While variables hold a single value, arrays hold many. They could be called a list of variables.
The simplest way to create an array is using this format:
{% highlight bash %}
names=("Anna" "Bob" "Clarice" "Dee")
{% endhighlight %}
This will create an array, called <code>names</code>, which holds 4 values.
The values in the array can be accessed using the syntax
{% highlight bash %}
${names[SELECTOR]}
{% endhighlight %}
where SELECTOR is the selector associated to the desired element. There are two kinds of arrays, depending on
what kind of selector is used.<br>
<code>names</code> is an <i>indexed</i> array, meaning the selector is a number. Since we didn't specify any when
we defined it, <code>names</code>' selectors start at 0 and count up from there.<br>
Thus we can access the string <code>"Anna"</code> using <code>names[0]</code>.
In the same way we use <code>names[1]</code> to access <code>"Bob"</code> and so on.<br>
If we want to specify a particular index for our values when creating the array we can do it like this:
{% highlight bash %}
names=([1]="Anna" [2]="Bob" [5]="Ernie" [12]="Luigi")
{% endhighlight %}
As you might have guessed, this will create an array with <code>"Anna"</code> at index 1, <code>"Bob"</code>
at index 2, <code>"Ernie"</code> at index 3 and so on.<br>
If our indices are all sequential and we just want to change the starting index, we can use
{% highlight bash %}
names=([12]="Luigi" "Mario" "Nate")
{% endhighlight %}
Which will create an array with <code>"Luigi"</code> at index 12, <code>"Mario"</code> at index 13 and
<code>"Nate"</code> at index 14.<br>
An indexed array's selector can also be negative, which will start counting from the end,
so <code>${names[-1]}</code> means <code>"Nate"</code>, <code>${names[-3]</code> is <code>"Luigi"</code> and so on.
<br>
The other kind of array is an <i>associative</i> array.
In an associative array, the values are not mapped to a number but to some other string.<br>
Here's an example of an associative array:
{% highlight bash %}
colors=([white]="#FFFFFF" [black]="#000000" [red]="#FF0000" [yellow]="#00FFFF")
{% endhighlight %}
In this case it is not possible to omit the selector as there is no logical word that "follows" white.
To access its members, we use the same syntax but write a string instead of a number as the selector.<br>
Arrays, both kinds, can also be modified after creation. We can use
{% highlight bash %}
colors[blue]="#0000FF"
{% endhighlight %}
to add an element to the array (or modify it if it exists already) and
{% highlight bash %}
unset colors[black]
{% endhighlight %}
to remove one.<br>
<br>
The <code>@</code> and <code>*</code> selectors are special - they cannot be written to but reading from them will
return <b>all</b> the values in the array, separated by spaces. Similarly, <code>${!colors[@]}</code> is a list of
all the selectors (or indices) that were assigned a value.<br>
<br>
<a href="parameter_expansion.html">Parameter Expansion</a> works on indexed arrays as well,
much like it works on strings, but it manipulates the members of the array instead of characters.
For example:
{% highlight bash %}
${names[@]: 13}
{% endhighlight %}
is equivalent to <code>"Mario" "Luigi"</code>, while
{% highlight bash %}
${#names[@]}
{% endhighlight %}
counts the number of elements in the array, in this case 3.<br>
<br>
Further reading: <a href="http://www.gnu.org/software/bash/manual/bashref.html#Arrays">the bash reference manual</a>
</p>