Composite Type: Indexed Arrays
Learn how to declare and use indexed arrays.
We'll cover the following
Indexed arrays
The Bourne Shell has scalar variables only. The interpreter stores them as strings in the memory. Working with such variables is inconvenient in some cases, so developers added arrays to the Bash language. When do we need an array?
Strings have a serious limitation. When we write a value to the scalar variable, it is a single unit. For example, we save a list of file names in the variable called files
. We separate them by spaces. As a result, the files
variable stores a single string from the Bash point of view—which can lead to errors.
The root cause of the problem comes from the POSIX standard. It allows any characters in file names except the null character (NULL). NULL means the end of a file name. The same character means the end of a string in Bash. Therefore, a string variable can contain NULL at the end only. It turns out that we have no reliable way to separate file names in a string. We cannot use NULL, but any other delimiter character can occur in the names.
We cannot reliably process the results of the ls
utility because of the delimiter problem. The utility cannot use NULL as a separator for the names of files and directories in its output. It leads to a recommendation to avoid parsing of the ls
output. Others advise not using ls
in variable declarations this way:
files=$(ls Documents/*.txt)
This declaration writes all TXT files of the Documents
directory to the files
variable. If there are spaces or line breaks in the filenames, we cannot separate them properly anymore.
Bash arrays solve the delimiter problem. An array stores a list of separate units. We can always read them in their original form. Therefore, we use an array to store the file names instead of a string. Here is a better declaration of the files
variable:
declare -a files=(Documents/*.txt)
This command declares and initializes the array named files
. Initializing means assigning values to the array’s elements.
When we declare a variable, Bash can deduce if it’s an array. This mechanism works when we skip the declare
built-in. Bash adds the appropriate attribute automatically. Here is an example:
files=(Documents/*.txt)
This command declares the indexed array files
.
Run the commands discussed in this lesson in the terminal below.
Get hands-on with 1200+ tech skills courses.