License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/848
如果你使用的是类UNIX的shell 你可能对bash 的 数组不是很熟悉。虽然没有向P语言(Perl, Python, PHP)那样强大,但是它们往往是很有用处的。 Bash 数组只有索引编号,但是它们是单独的。也就是说你不必定义所有索引。整个数组可以通过封闭括号中的数组项分配:
arr=(Hello World)
单个项目可以用熟悉的数组语法被分配(除非你已经习惯了Basic或Fortran):
arr[0]=Hello arr[1]=World
但是,当你要引用数组项它变得有点难看:
echo ${arr[0]} ${arr[1]}
man 手册中的部分内容: 大括号是必需的,以避免与路径扩展冲突。
常用的用法 ${arr[*]} # 所有数组元素 ${!arr[*]} # 所有数组索引 ${#arr[*]} # 数组元素个数 ${#arr[0]} # 数组第0个元素长度
${!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[*]}, 得到的结果是一致的除了当使用引用字符串扩展数组元素的时候。 在这种情况下也是相同的,使用 引用字符串扩展 "$*" and "$@": "${arr[*]}" 将所有元素作为一个单独的元素返回 "${arr[@]}" 将每个元素作为一个独立的元素返回 下面的例子说明了如何 不引用, 引用 "*", 和 quoted "@" 扩大影响 (当数组元素包含空格的时候特别重要)
#!/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
Reference: