天天看點

linux12shell程式設計 --> 數組

文章目錄

  • ​​數組​​
  • ​​一 、數組介紹​​
  • ​​1、什麼是數組?​​
  • ​​2、為何要用數組?​​
  • ​​二 、數組的使用​​
  • ​​1、 數組的定義​​
  • ​​2、 通路數組内元素​​
  • ​​3、執行個體​​
  • ​​4 、擷取數組元素​​
  • ​​5、修改/添加數組元素​​
  • ​​5、 删除數組元素​​
  • ​​6、 數組内元素的截取​​
  • ​​7、 數組内容的替換​​
  • ​​三、 關聯數組​​
  • ​​1、數組分為兩種​​
  • ​​2、聲明關聯數組​​
  • ​​四 、周遊數組​​
  • ​​方法一:​​
  • ​​方法二:​​
  • ​​方法三:​​
  • ​​五 、練習​​
  • ​​練習1:​​
  • ​​練習2:​​
  • ​​練習3:​​
  • ​​練習4​​
  • ​​練習5​​

數組

一 、數組介紹

1、什麼是數組?

數組就是一系列元素的集合,一個數組内可以存放多個元素      

2、為何要用數組?

我們可以用數組将多個元素彙總到一起,避免單獨定義的麻煩      

二 、數組的使用

1、 數組的定義

# 方式一:array=(元素1 元素2 元素3)
array=(mm 18 male)

# 方式二:array=([key1]=value1 [key2]=value2 [key3]=value3)
array=([0]=111 [1]="two" [2]=333)

# 方式三:依次指派
array_new[0]=111
array_new[1]=222
array_new[2]="third"

# 方式四:利用執行指令的結果設定數組元素:array=($(指令))  或者  array=(`指令`)
該方式會将指令的結果以空格為分隔符切成多個元素然後指派給數組
[root@openvpn ~]# ls /test
a.txt b.txt
[root@openvpn ~]# array3=(`ls /test`)
[root@openvpn ~]# declare -a |grep array3
declare -a array3='([0]="a.txt" [1]="b.txt")'


# ps:檢視聲明過的數組
declare -a

[root@openvpn day7]# x=(1 233 41)
[root@openvpn day7]# echo ${x[0]}
1
[root@openvpn day7]# echo ${!x[@]}
0 1 2
# 取數組的索引      

2、 通路數組内元素

[root@openvpn ~]# array=(mm 18 male)

#1、按照索引通路數組内指定位置的元素
[root@openvpn ~]# echo ${array[0]}
mm
[root@openvpn ~]# echo ${array[1]}
18
[root@openvpn ~]# echo ${array[2]}
male
[root@openvpn ~]# echo ${array[-1]}  # 支援負向索引
male


# 2、通路數組内全部元素資訊
[root@openvpn ~]# echo ${array[*]}
mm 18 male
[root@openvpn ~]# echo ${array[@]}
mm 18 male

# 3、擷取數組元素的長度
[root@openvpn ~]# echo ${#array[*]}
3
[root@openvpn ~]# echo ${#array[@]}
3

[root@openvpn ~]# declare -a mm='([0]="gril")'
[root@openvpn ~]# echo ${#mm[*]}
4      

3、執行個體

# for循環檢視ls/root/下的檔案
[root@openvpn day7]# cat arr.sh 
#! /bin/bash
declare -a arr=(`ls /root`)

for i in ${arr[*]}
do
    echo $i
done
[root@openvpn day7]# ./arr.sh 
anaconda-ks.cfg
dead.letter
hosts.sh
shell
ssh-jump.sh
# while 循環
[root@openvpn day7]# cat arr1.sh 
num=#{#arr[*]}
while (( $num > 0 ))
do
    echo ${arr[$num]}
    let num--
done      

4 、擷取數組元素

# 預設周遊擷取下标為0的資料
echo $arr

# 正向擷取從0開始,反向擷取從-1開始

# 擷取所有的值
${arr[*]}
${arr[@]}      

5、修改/添加數組元素

[root@openvpn ~]# array=(mm 18 male)
[root@openvpn ~]# array[0]="mm"  # 修改
[root@openvpn ~]# array[3]="IT"  # 添加
[root@openvpn ~]# declare -a |grep array
declare -a array='([0]="mm" [1]="18" [2]="male" [3]="IT")'
# 存在的下标及修改,不存在的下标及添加      

5、 删除數組元素

[root@openvpn ~]# unset array[0]
[root@openvpn ~]# echo ${array[*]}
18 male IT
[root@openvpn ~]# declare -a |grep array
declare -a array='([1]="18" [2]="male" [3]="IT")'
[root@openvpn ~]# 
[root@openvpn ~]# 
[root@openvpn ~]# unset array[2]
[root@openvpn ~]# declare -a |grep array
declare -a array='([1]="18" [3]="IT")'

[root@openvpn ~]# unset array  # 删除整個數組
[root@openvpn ~]# echo ${array[*]}

# 指定下标則删除某一個值,不指定下标則删除所有的值      

6、 數組内元素的截取

# 截取某一個值
[root@openvpn ~]# array=(mm 18 male IT 1.80)
[root@openvpn ~]# echo ${array[*]:1}    # 從索引1開始,一直到最後
18 male IT 1.80
[root@openvpn ~]# echo ${array[*]:1:3}  # 從索引1開始,通路3個元素
18 male IT
# 截取某部分值
[root@openvpn ~]# array=(one two three four five fire)
[root@openvpn ~]# echo ${array[*]#one}
two three four five fire
[root@openvpn ~]# echo ${array[*]#f*e}
one two three four      

7、 數組内容的替換

[root@openvpn ~]# array=(one two three four five fire)

[root@openvpn ~]# echo ${array[*]/five/abc}
one two three four abc fire

[root@openvpn ~]# echo ${array[*]/f*e/abc}
one two three four abc abc      

三、 關聯數組

1、數組分為兩種

- 普通數組:隻能使用整數作為數組索引,我們前面介紹的都是普通數組
- 關聯數組:可以使用字元串作為數組索引,需要用declare -A 聲明      

2、聲明關聯數組

[root@openvpn ~]# declare -A info
[root@openvpn ~]# info["name"]="mm"
[root@openvpn ~]# info["age"]=18
[root@openvpn ~]# info["gender"]="male"
[root@openvpn ~]# declare -A |grep info
declare -A info='([gender]="male" [name]="mm" [age]="18" )'
[root@openvpn ~]# 
[root@openvpn ~]# echo ${info[*]}
male mm 18
[root@openvpn ~]# echo ${info["name"]}
mm
#方式二
[root@openvpn day7]# declare -A array=(["name"]=mm)
#方式三
[root@openvpn day7]# declare -A array
[root@openvpn day7]# array['name']=shanhe      

四 、周遊數組

方法一:

利用擷取所有資訊進行周遊 (适用于普通數組與關聯數組)

# 例1
declare -A array
array=(["name"]="mm" ["age"]=18 ["gender"]="male")

for item in ${array[*]}
do 
    echo $item
done

# 例2
array=("mm" 18 "male")
for item in ${array[*]}
do 
    echo $item
done

1、周遊key
#!/bin/bash
declare -A array=([name]="shanhe" )
for i in ${!array[*]}
do
    echo $i 
done

2、周遊值
#!/bin/bash
declare -A array=([name]="shanhe" )
for i in ${array[*]}
do
    echo $i 
done      

方法二:

通過數組元數的索引進行周遊(适用于普通數組與關聯數組)

# 例1
declare -A array
array=(["name"]="mm" ["age"]=18 ["gender"]="male")

for i in ${!array[*]}  # echo ${!array[*]}  # 擷取的是key資訊:name age gender
do 
    echo "$i:${array[$i]}"
done

# 例2
array=("mm" 18 "male")
for i in ${!array[*]}  # echo ${!array[*]} 直接擷取所有元素的索引資訊
do 
    echo $i
    echo ${array[i]}
done

# 例3
[root@openvpn day7]# cat arr3.sh 
#! /bin/bash

declare -A m
m["name"]=mm
m["age"]=18
m["sex"]=man

for i in ${m[*]}
do
    echo  $i
done
[root@openvpn day7]# ./arr3.sh 
mm
18
man      

方法三:

根據數組長度資訊進行周遊,(适用于普通數組)

# 周遊數組: 按照索引累加變量
array=("mm" 18 "male")

for ((i=0;i<${#array[*]};i++))
do 
    echo "$i:${array[$i]}"
done
# 方式二

[root@openvpn day7]# cat array.sh 
#! /bin/bash

array1=(111 2222 433)

for ((i=0;i<${#array1[*]};i++))
do
    echo ${array1[$i]}
done
[root@openvpn day7]# ./array.sh 
111
2222
433      

五 、練習

練習1:

對指定的IP位址進行網絡測試

[root@openvpn day7]# cat arr4.sh 
#! /bin/bash
declare -a ip=({1..254})
for i in ${ip[*]}
do
   (ping -c1 -t1 192.168.15.$i &> /dev/null
   if [ $? -eq 0 ];then
    echo "192.168.15.$i up"
   else
      echo "192.168.15.$i down"
   fi)&
done
# 方式二
#!/bin/bash 
array=(
    10.0.0.7
    10.0.0.8
    10.0.0.9
    10.0.0.41
)

for info in ${array[*]}
do
   ping -c 2 -W 1  $info
done      

練習2:

統計登入shell的種類及對應的個數(關聯數組)

#!/bin/bash 
declare -A  array_for_shell
while read line  # done後面接<将檔案重定向給while;while後再接read将檔案流指派給變量
do
    login_shell=`echo $line | cut -d: -f7`
    let array_for_shell["$login_shell"]++  # 當使用let時,變量前面不必加上$                                                                                                                                              
done < /etc/passwd


for k in ${!array_for_shell[*]}
do
    echo $k:${array_for_shell[$k]}
done      

練習3:

[root@mm test]# cat a.sh 
#!/usr/bin/env bash

declare -A array
while read line
do
    let array[`echo $line | cut -d: -f7`]++
done < /etc/passwd

for k in ${!array[*]}
do
    echo $k:${array[$k]}
done
[root@mm test]# 
[root@mm test]# ./a.sh 
/sbin/nologin:41
/bin/sync:1
/bin/bash:2
/sbin/shutdown:1
/sbin/halt:1      

練習4

[root@openvpn day7]# cat array1.sh 
#! /bin/bash

declare -A array1=(["name"]="mm" ["age"]=18 ["gender"]="male")
for i in ${array1[*]}
do
    echo $i
done

echo "==============="
for item  in ${!array1[*]}
do
    echo $item
done
[root@openvpn day7]# ./array1.sh 
male
mm
18
===============
gender
name
age      

練習5

# 方式一 for循環
[root@openvpn day7]# cat arr5.sh 
#! /bin/bash

for i in `tail /etc/passwd  |awk -F: '{print $NF}'`
do
    echo $i
done
[root@openvpn day7]# ./arr5.sh 
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
# 方式二 while循環
[root@openvpn day7]# cat arr6.sh 
#! /bin/bash

while  read line
do
    i=`echo $line |awk -F: '{print $NF}'`
    echo $i
done < tail /etc/passwd
[root@openvpn day7]# ./arr6.sh 
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/bash