如果您使用的是“标准” * NIX Shell,则可能不熟悉数组的有用bash功能。虽然bash中的数组不如P语言(Perl,Python和PHP)和其他编程语言中的数组好,但它们通常很有用。
Bash数组只有数字索引,但是它们是可选的,也就是说,您不必显式定义所有索引的值。可以通过将条目括在括号中来定义整个数组:
arr=(Hello World)
可以使用熟悉的语法(从BASIC(请原谅Dijkstra-翻译者的注意事项)到Fortran)来定义单个记录:
arr[0]=Hello
arr[1]=World
但是,相反的情况看起来比较丑陋。如果需要引用特定条目,则:
echo ${arr[0]} ${arr[1]}
在手册页中:
“扩展到文件的完整路径时,需要花括号以防止冲突。 ”
此外,还提供了以下怪异的构造:
${arr[*]} #
${!arr[*]}#
${#arr[*]}#
${#arr[0]}# ( )
$ {!arr [*]}是bash的一个相对较新的添加,不是原始实现的一部分。以下构造显示了简单使用数组的示例。注意“ [索引] =值”,这使您可以将特定的值分配给特定的记录号。
#!/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
运行该脚本将产生以下输出:
数组大小:5
数组项:
一个
2
3
4
5
数组索引:
0
1
2
3
5
数组项和索引:
0:一个
1:2
2:3
3:4
5:5
。注意在{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
启动时输出:
原始数组中的项数:4
第一项
第二项
第三
项
未加引号的扩展后:6
第一
项
第二
项
第三
项
在带引号的扩展后:1
第一项第二项第三项
在@引用扩展后:4
第一项
第二项目
第三
项