認識數組:
變量是存儲單個元素的內存空間,而數組就是多個變量的合集,是一串連續的空間,但是,整個數組只能有一個名字。
數組內的數據都有指定的索引,以找到數組內指定的數據。索引的編號是從0開始,依次遞增(0,1,2,3…),屬于數值索引。索引也支持自定義的格式,而不僅是數值格式的索引,即為關聯索引,在bash4.0版本之后開始支持。而且,bash的數組支持稀疏格式,即索引不連續(如,0,2,3,5…)。
定義數組:
定義數組,首先需要聲明數組,如:
declare -a ARRAY_NAME
declare -A ARRAY_NAME: 關聯數組
數組元素的賦值:
(1) 一次只賦值一個元素;
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday" weekdays[4]="Thursday"
(2) 一次賦值全部元素:
ARRAY_NAME=("VAL1" "VAL2" "VAL3" …)
weekdays=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" )
(3) 只賦值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" …)
weekdays=([0]="Sunday" [3]="Wednesday")
(4) 交互式數組值對賦值
read -a ARRAY
[root@localhost ~]# read -a number 1 3 5 7 9 [root@localhost ~]#
引用數組:
格式:引用數組元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下標為0的元素
數組的長度(數組中元素的個數):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
[root@localhost ~]# read -a number 1 3 5 7 9 [root@localhost ~]# echo ${number[1]} 3 [root@localhost ~]# echo ${number[0]} 1 [root@localhost ~]# echo ${number[*]} 1 3 5 7 9 [root@localhost ~]# echo ${#number[*]} 5
示例1:生成10個隨機數保存于數組中,并找出其最大值和最小值
[root@localhost shuzu]# vim snum.sh #!/bin/bash declare -a rand declare -i max declare -i min for i in {0..9} ;do rand[$i]=$RANDOM echo ${rand[$i]} if [ $i -eq 0 ] ;then max=${rand[$i]} min=${rand[$i]} else [ "$max" -lt "${rand[$i]}" ] && max=${rand[$i]} [ "$min" -gt "${rand[$i]}" ] && min=${rand[$i]} fi done echo "max number is $max " echo "min number is $min "
示例2:編寫腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的文件;要統計其下標為偶數的文件中的行數之和
[root@localhost shuzu]# vim sfilenum.sh #!/bin/bash declare -a files declare -i line=0 files=(/var/log/*.log) for i in `seq 0 $[${#files[*]}-1]` ;do if [ $[$i%2] -eq 0 ] ;then let line+=`wc -l ${files[$i]} | cut -d" " -f1` fi done echo "lines is $line"
處理數組數據
數組操作語法:
語法 | 描述 |
${!array[*]} |
取關聯數組所有鍵(索引) |
${!array[@]} | 取關聯數組所有鍵(索引) |
${array[*]} | 取關聯數組所有值(元素) |
${array[@]} |
取關聯數組所有值(元素) |
${#array[@]} | 關聯數組的長度(元素個數) |
${#array[*]} | 關聯數組的長度(元素個數) |
引用數組中的元素:
所有元素:${ARRAY[@]}, ${ARRAY[*]}
[root@localhost ~]# echo ${weekdays[*]} Sunday Monday Tuesday Wednesday Thursday Friday Saturday [root@localhost ~]# echo ${weekdays[@]} Sunday Monday Tuesday Wednesday Thursday Friday Saturday
數組切片:${ARRAY[@]:offset:number}
offset: 要跳過的元素個數
number: 要取出的元素個數
取偏移量之后的所有元素 ${ARRAY[@]:offset}
[root@localhost ~]# echo ${weekdays[@]:2} Tuesday Wednesday Thursday Friday Saturday [root@localhost ~]# echo ${weekdays[@]:2:2} Tuesday Wednesday
向數組中追加元素:
ARRAY[${#ARRAY[*]}]
[root@localhost ~]# number[${#number[@]}]=2 [root@localhost ~]# echo ${number[@]} 1 3 5 7 9 2
刪除數組中的某元素:導致稀疏格式
unset ARRAY[INDEX]
[root@localhost ~]# unset number[5] [root@localhost ~]# echo ${number[@]} 1 3 5 7 9
關聯數組:
declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘…)
[root@localhost ~]# declare -A num [root@localhost ~]# num=([jishu]="1 3 5" [oushu]="2 4 6") [root@localhost ~]# echo ${num[jishu]} 1 3 5 [root@localhost ~]# echo ${num[oushu]} 2 4 6
示例3:打印用戶的手機號
#!/bin/bash name=(Leo Tom Lisa) declare -A phone phone=([Leo]=666 [Tom]=888 [Lisa]=999) for i in `eval echo {0..$((${#name[*]}-1))}` do echo ${name[i]} phone number is ${phone["${name[i]}"]} done
#!/bin/bash declare -A phone phone=([Leo]=666 [Tom]=888 [Lisa]=999) for key in ${!phone[*]} do echo "$key phone number is : ${phone[$key]}" done
原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/40377