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

原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/40377

(0)
GrootGroot
上一篇 2016-08-25
下一篇 2016-08-26

相關推薦

  • Zabbix 新版微信告警 [2017]

    Zabbix 新版微信告警 Zabbix 新版微信告警 date 2017-06-14zabbix Zabbix可以通過多種方式把告警信息發送到指定人,常用的有郵件,短信報警方式,但是越來越多的企業開始使用zabbix結合微信作為主要的告警方式,這樣可以及時有效的把告警信息推送到接收人,方便告警的及時處理。 關于郵件報警可以參考: Zabbix 使用腳本發送…

    2017-06-17
  • 8/10作業腳本

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中 3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空…

    Linux干貨 2016-08-15
  • 網絡知識點

    1. 實現異地搭建局域網的方法1>. 讓運行商拉專線,這是相當昂貴的。2>.  VPN (Virtual PrivateNetwork)  虛擬專用網絡 2. VPN的隧道協議主要有三種:PPTP、L2TP和IPSec。其中PPTP和L2TP協議工作在OSI模型的第二層,又稱為二層隧道協議;IPSec是第三層隧道協議。 2. …

    Linux干貨 2016-09-01
  • 進程及任務管理

    進程概念 內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能等 Process: 運行中的程序的一個副本,是被載入內存的一個指令集合     進程ID(Process ID,PID)號碼被用來標記各個進程     UID、GID、和SELi…

    Linux干貨 2016-09-09
  • Nginx代理MogileFS并實現負載均衡和高可用

    Nginx代理MogileFS并實現負載均衡和高可用 MogileFS nginx 負載均衡 前言 實驗拓撲 實驗環境 實驗步驟 配置MogileFS 配置Nginx 總結 前言 上篇文章我們了解分布式系統和MogileFS的基本使用, 但是那樣的架構是有問題的, 本篇文章我們來了解一下如何使用nginx-mogilefs-module-…

    大數據運維 2016-05-05
  • N25第七周博客作業

    第七周博客作業 1、 創建一個10G分區,并格式為ext4文件系統; fdisk/dev/sdb à nàpàlast扇區:+10Gàwàpartx -a /dev/sdb   (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; mke2fs  -t ext4 -b 2…

    Linux干貨 2017-02-20
欧美性久久久久