shell腳本之數組

認識數組:

   變量是存儲單個元素的內存空間,而數組就是多個變量的合集,是一串連續的空間,但是,整個數組只能有一個名字。

   數組內的數據都有指定的索引,以找到數組內指定的數據。索引的編號是從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 "

wKioL1e9VgiAoA4mAAAgKlfOkBg376.png


示例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"

wKiom1e9VvqiGwdOAAAPJQm1has356.png


處理數組數據


數組操作語法:

語法描述
${!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

wKioL1e9f0nA7JZhAAAPjFu8vrI857.png

#!/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

wKiom1e9gB6wJjBgAAAPxH_TlR8270.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章