Bash 数组

作者:Mitch Frazier

如果您习惯了“标准”*NIX Shell,您可能不熟悉 Bash 的数组功能。 尽管不如 P 语言(Perl、Python 和 PHP)及其他语言中的类似结构那么强大,但它们通常非常有用。

Bash 数组只有数字索引,但它们是稀疏的,即您不必定义所有索引。 可以通过将数组项括在括号中来分配整个数组

  arr=(Hello World)
可以使用熟悉的数组语法分配单个项目(除非您习惯了 Basic 或 Fortran)
  arr[0]=Hello
  arr[1]=World
但是,当您想要引用数组项时,它会变得有点难看
  echo ${arr[0]} ${arr[1]}
引用自手册页
需要大括号以避免与路径名扩展冲突。

此外,以下时髦的构造可用

  ${arr[*]}         # All of the items in the array
  ${!arr[*]}        # All of the indexes in the array
  ${#arr[*]}        # Number of items in the array
  ${#arr[0]}        # Length of item zero
The${!arr[*]}是 bash 的一个相对较新的补充,它不是原始数组实现的一部分。

以下示例显示了一些简单的数组用法(注意“[index]=value”赋值以分配特定索引)

#!/bin/bash

array=(one two three four [5]=five)

echo "Array size: ${#array[*]}"

echo "Array items:"
for item in ${array[*]}
do
    printf "   %s\n" $item
done

echo "Array indexes:"
for index in ${!array[*]}
do
    printf "   %d\n" $index
done

echo "Array items and indexes:"
for index in ${!array[*]}
do
    printf "%4d: %s\n" $index ${array[$index]}
done
运行它会产生以下输出
Array size: 5
Array items:
   one
   two
   three
   four
   five
Array indexes:
   0
   1
   2
   3
   5
Array items and indexes:
   0: one
   1: two
   2: three
   3: four
   5: five

请注意,在诸如${arr[*]}中,可以使用“@”符号代替“*”,结果相同,除非在带引号的字符串中扩展到数组的项。 在这种情况下,行为与在带引号的字符串中扩展“$*”和“$@”时相同"${arr[*]}"将所有项作为单个单词返回,而"${arr[@]}"将每个项目作为单独的单词返回。

以下示例显示了未加引号、带引号的“*”和带引号的“@”如何影响扩展(当数组项本身包含空格时尤其重要)

#!/bin/bash

array=("first item" "second item" "third" "item")

echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
    printf "   %s\n" "${array[$ix]}"
done
echo

arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
echo

arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
    printf "   %s\n" "${arr[$ix]}"
done
运行时输出
Number of items in original array: 4
   first item
   second item
   third
   item

After unquoted expansion: 6
   first
   item
   second
   item
   third
   item

After * quoted expansion: 1
   first item second item third item

After @ quoted expansion: 4
   first item
   second item
   third
   item

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是 Linux Journal 的贡献者和朋友。

加载 Disqus 评论