Array,数组
变量:存储单个元素的内存空间;
数组:存储多个元素的内存空间;
数组名:整个数组只有一个名字;
数组索引:编号从0开始;
数组名[索引]
array[index]
取值:
${array[index]}
如果不指定索引号index,则默认返回index为0的元素;
bash-4及之后的版本,支持自定义索引格式,而不仅仅是0,1,2,...数字格式;
此类数组称之为"关联数组";
声明数组:
#help declare
-a to make NAMEs indexed arrays. 声明索引数组;
-A to make NAMEs associative arrays. 声明关联数组;
数组中元素的赋值方式:(无需事先声明)
(1)一次只赋值一个元素;
ARRAY_NAME[index]=value
#animals[0]=pig
#animals[1]=dog
#echo $animals #若不加索引号,则默认返回第一个元素的值;
#echo ${animals[1]} #返回第二个元素的值;
(2)一次赋值全部元素;(连续赋值)
ARRAY_NAME=("value1" "value2" "value3" ...)
#weekdays=("Monday" "Tuesday" "Wednesday")
#echo ${weekdays[2]}
连接数组,将若干个数组进行拼接:
#arrayN=(${array1[@]} ${array2[@] ...})
(3)只赋值特定元素:(稀疏格式的数组,不连续赋值)
ARRAY_NAME=([0]="value1" [3]="value4" ...)
#sword=([0]="yitian" [3]="longquan")
#echo ${sword[3]}
(4)read -a ARRAY_NAME
#read -a jianghu
Yuebuqun Dongfangbubai Qqianchaotaijian
#echo ${jianghu[1]}
Dongfangbubai
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
#echo ${#world[*]}
#echo ${#world[@]}
如果不加索引号index,则返回第一个元素的字符长度:
#echo ${#animals}
3
如果不加#,则返回数组中的所有元素:
#echo ${animals[*]}
#echo ${animals[@]}
pig dog
${array[@]}输出的是以空白隔开的元素值;
${array[*]}输出的是一整个字符串;
示例:生成10个随机数,找出其中的最大值;
#vim rand.sh
#!/bin/bash
#
declare -a rand
declare -i max=0
for i in {0..9};do
rand[$i]=$RANDOM
echo ${rand[$i]}
[ ${rand[$i]} -gt $max ] && max=${rand[$i]}
done
echo "MAX: $max"
定义一个数组,数组中的元素是/var/log目录下的所有以.log结尾的文件;
统计其index为偶数的文件的行数之和;
#vim array1.sh
#!/bin/bash
#
declare -a files
files=(/var/log/*.log)
declare -i lines=0
for i in `seq 0 $[${#files[*]}-1]`;do
if [ $[$i%2] -eq 0 ];then
let lines+=`wc -l ${files[$i]} | awk ‘{print $1}‘`
fi
done
echo "Lines: $lines"
数组元素切片:
${ARRAY_NAME[@]:offset:number}
offset:要跳过的元素个数;偏移量;
number:要取出的元素个数;省略number时,表示取偏移量之后的所有元素;
#files=(/etc/[Pp]*)
#echo ${files[*]}
/etc/PackageKit /etc/pam.d /etc/passwd /etc/passwd- /etc/php.d /etc/php.ini /etc/phpMyAdmin /etc/php-tcpdf /etc/pinforc /etc/pkcs11 /etc/pki /etc/plymouth /etc/pm /etc/polkit-1 /etc/popt.d /etc/postfix /etc/ppp /etc/prelink.conf.d /etc/printcap /etc/profile /etc/profile.d /etc/protocols /etc/pulse /etc/puppet /etc/python
#echo ${files[@]:2:3} #跳过2个,取三个;
/etc/passwd /etc/passwd- /etc/php.d
#echo ${files[@]:5} #跳过5个,取后面所有;
向数组中追加元素:
ARRAY_NAME[${#ARRAY_NAME[@]}]=value
删除数组中的某元素:
unset Array[index]
删除整个数组:
unset Array
关联数组,需要事先声明;
declare -A ARRAY_NAME
ARRAY_NAME=([index_name1]="value1" [index_name2]="value2" ...)
#declare -A world
#world[us]="america"
#echo "${world[us]}"
#world[uk]="united kingdom"
#echo "${world[uk]}"
原文地址:http://keithtt.blog.51cto.com/3080111/1813934