Differences between revisions 1 and 6 (spanning 5 versions)
Revision 1 as of 2007-05-02 22:48:54
Size: 2248
Editor: redondos
Comment:
Revision 6 as of 2008-04-14 15:52:29
Size: 3030
Editor: 82-71-12-170
Comment:
Deletions are marked like this. Additions are marked like this.
Line 16: Line 16:
The awkward experssion {{{ ${#host[@]} }}} returns the number of elements for the array {{{host}}}. Also noteworthy is the fact that inside the square brackets, {{{i++}}} works as a C programmer would expect. The square brackets in an array reference force an ArithmeticExpression. The indexing always begins with 0.
Line 18: Line 18:
It's possible to assign multiple values to an array at once, but the syntax differs from BASH to KornShell: The awkward expression {{{ ${#host[@]} }}} returns the number of elements for the array {{{host}}}. Also noteworthy is the fact that inside the square brackets, {{{i++}}} works as a C programmer would expect. The square brackets in an array reference force an ArithmeticExpression.

It's possible to assign multiple values to an array at once, but the syntax differs from Bash to KornShell:
Line 21: Line 23:
 # BASH  # Bash
Line 23: Line 25:
Line 26: Line 29:
Using array elements ''en masse'' is one of the key features. Much like {{{"$@"}}} for the positional parameters, {{{"${arr[@]}"}}} expands the array to a list of words, one array element per word, even if the words contain internal whitespace. For example, Bash also lets you initialize an array using a [:glob:]:

 {{{
 oggs=(*.ogg)}}}

Using array elements ''en masse'' is one of the key features. In exactly the same way that {{{"$@"}}} is expanded for positional parameters, {{{"${arr[@]}"}}} is expanded to a list of words, one array element per word. For example,
Line 33: Line 41:
If one simply wants to dump the full array, {{{"${arr[*]}"}}} will cause the elements to be concatenated together, with the first character of {{{IFS}}} (a space by default) between them. This works even if the elements contain whitespace. You always end up with the same number of words as you have array elements.

If one simply wants to dump the full array, {{{"${arr[*]}"}}} will cause the elements to be concatenated together, with the first character of {{{IFS}}} (a space by default) between them.  As it happens, "$*" is expanded the same way for positional parameters.
Line 55: Line 65:
[#faq73 Parameter Expansions] may be performed on array elements ''en masse'' as well: [:BashFAQ#faq73:Parameter Expansions] may be performed on array elements ''en masse'' as well:
Line 60: Line 70:
 echo "${arr[@]/[aeiou]/}" # prints bc df gh jkl
 
}}}
 echo "${arr[@]/[aeiou]/}" # prints bc df gh jkl}}}
Line 63: Line 72:
For examples of loading data into arrays, see [#faq1 FAQ #1]. For examples of using arrays to hold complex shell commands, see [#faq50 FAQ #50] and [#faq40 FAQ #40]. Parameter Expansion can also be used to extract elements from an array:

 {{{
 echo "${arr[@]:1:3}" # three elements starting at #1 (second element)
 echo "${arr[@]:(-2)}" # last two elements
 echo "${@:(-1)}" # last positional parameter
 echo "${@:(-2):1}" # second-to-last positional parameter}}}

The {{{@}}} array (the array of positional parameters) can be used just like any regularly named array.

For examples of loading data into arrays, see [:BashFAQ#faq1:FAQ #1]. For examples of using arrays to hold complex shell commands, see [:BashFAQ#faq50:FAQ #50] and [:BashFAQ#faq40:FAQ #40].

Anchor(faq5)

How can I use array variables?

BASH and KornShell already have one-dimensional arrays indexed by a numerical expression, e.g.

  •  host[0]="micky"
     host[1]="minnie"
     host[2]="goofy"
     i=0
     while (($i < ${#host[@]} ))
     do
         echo "host number $i is ${host[i++]}"
     done

The indexing always begins with 0.

The awkward expression  ${#host[@]}  returns the number of elements for the array host. Also noteworthy is the fact that inside the square brackets, i++ works as a C programmer would expect. The square brackets in an array reference force an ArithmeticExpression.

It's possible to assign multiple values to an array at once, but the syntax differs from Bash to KornShell:

  •  # Bash
     array=(one two three four)
    
     # KornShell
     set -A array -- one two three four

Bash also lets you initialize an array using a [:glob:]:

  •  oggs=(*.ogg)

Using array elements en masse is one of the key features. In exactly the same way that "$@" is expanded for positional parameters, "${arr[@]}" is expanded to a list of words, one array element per word. For example,

  •  for x in "${arr[@]}"; do
       echo "next element is '$x'"
     done

This works even if the elements contain whitespace. You always end up with the same number of words as you have array elements.

If one simply wants to dump the full array, "${arr[*]}" will cause the elements to be concatenated together, with the first character of IFS (a space by default) between them. As it happens, "$*" is expanded the same way for positional parameters.

  •  arr=(x y z)
     IFS=/; echo "${arr[*]}"; unset IFS
     # prints x/y/z

BASH's arrays are also sparse. Elements may be added and deleted out of sequence.

  •  arr=(0 1 2 3)
     arr[42]="what was the question?"
     unset arr[2]
     echo "${arr[*]}"
     # prints 0 1 3 what was the question?

BASH 3.0 added the ability to retrieve the list of index values in an array, rather than just iterating over the elements:

  •  echo ${!arr[*]}
     # using the previous array, prints 0 1 3 42

[:BashFAQ#faq73:Parameter Expansions] may be performed on array elements en masse as well:

  •  arr=(abc def ghi jkl)
     echo "${arr[@]#?}"          # prints bc ef hi kl
     echo "${arr[@]/[aeiou]/}"   # prints bc df gh jkl

Parameter Expansion can also be used to extract elements from an array:

  •  echo "${arr[@]:1:3}"        # three elements starting at #1 (second element)
     echo "${arr[@]:(-2)}"       # last two elements
     echo "${@:(-1)}"            # last positional parameter
     echo "${@:(-2):1}"          # second-to-last positional parameter

The @ array (the array of positional parameters) can be used just like any regularly named array.

For examples of loading data into arrays, see [:BashFAQ#faq1:FAQ #1]. For examples of using arrays to hold complex shell commands, see [:BashFAQ#faq50:FAQ #50] and [:BashFAQ#faq40:FAQ #40].

BashFAQ/005 (last edited 2023-03-25 22:39:06 by emanuele6)