Bash 数组
发布于 2008年6月19日
如果您习惯了“标准”*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 zeroThe${!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