zoukankan      html  css  js  c++  java
  • 数组

    一 数组介绍

    什么是数组?

    数组就是一系列元素的集合,一个数组内可以存放多个元素
    

    为何要用数组?

    我们可以用数组将多个元素汇总到一起,避免单独定义的麻烦
    

    二 数组的使用

    2.1 数组的定义

    # 方式一:array=(元素1 元素2 元素3)
    array=(egon 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@aliyun ~]# ls /test
    a.txt	b.txt
    [root@aliyun ~]# array3=(`ls /test`)
    [root@aliyun ~]# declare -a |grep array3
    declare -a array3='([0]="a.txt" [1]="b.txt")'
    
    
    # ps:查看声明过的数组
    declare -a
    

    2.2 访问数组内元素

    [root@aliyun ~]# array=(egon 18 male)
    
    #1、按照索引访问数组内指定位置的元素
    [root@aliyun ~]# echo ${array[0]}
    egon
    [root@aliyun ~]# echo ${array[1]}
    18
    [root@aliyun ~]# echo ${array[2]}
    male
    [root@aliyun ~]# echo ${array[-1]}  # 支持负向索引
    male
    
    
    # 2、访问数组内全部元素信息
    [root@aliyun ~]# echo ${array[*]}
    egon 18 male
    [root@aliyun ~]# echo ${array[@]}
    egon 18 male
    
    # 3、获取数组元素的长度
    [root@aliyun ~]# echo ${#array[*]}
    3
    [root@aliyun ~]# echo ${#array[@]}
    3
    

    2.3 修改/添加数组元素

    [root@aliyun ~]# array=(egon 18 male)
    [root@aliyun ~]# array[0]="EGON"  # 修改
    [root@aliyun ~]# array[3]="IT"  # 添加
    [root@aliyun ~]# declare -a |grep array
    declare -a array='([0]="EGON" [1]="18" [2]="male" [3]="IT")'
    

    2.4 删除数组元素

    [root@aliyun ~]# unset array[0]
    [root@aliyun ~]# echo ${array[*]}
    18 male IT
    [root@aliyun ~]# declare -a |grep array
    declare -a array='([1]="18" [2]="male" [3]="IT")'
    [root@aliyun ~]# 
    [root@aliyun ~]# 
    [root@aliyun ~]# unset array[2]
    [root@aliyun ~]# declare -a |grep array
    declare -a array='([1]="18" [3]="IT")'
    
    [root@aliyun ~]# unset array  # 删除整个数组
    [root@aliyun ~]# echo ${array[*]}
    
    [root@aliyun ~]# 
    

    2.5 数组内元素的截取

    [root@aliyun ~]# array=(egon 18 male IT 1.80)
    [root@aliyun ~]# echo ${array[*]:1}    # 从索引1开始,一直到最后
    18 male IT 1.80
    [root@aliyun ~]# echo ${array[*]:1:3}  # 从索引1开始,访问3个元素
    18 male IT
    
    [root@aliyun ~]# array=(one two three four five fire)
    [root@aliyun ~]# echo ${array[*]#one}
    two three four five fire
    [root@aliyun ~]# echo ${array[*]#f*e}
    one two three four
    

    2.6 数组内容的替换

    [root@aliyun ~]# array=(one two three four five fire)
    
    [root@aliyun ~]# echo ${array[*]/five/abc}
    one two three four abc fire
    
    [root@aliyun ~]# echo ${array[*]/f*e/abc}
    one two three four abc abc
    

    三 关联数组

    数组分为两种

    • 普通数组:只能使用整数作为数组索引,我们前面介绍的都是普通数组
    • 关联数组:可以使用字符串作为数组索引,需要用declare -A声明

    声明关联数组

    [root@aliyun ~]# declare -A info
    [root@aliyun ~]# info["name"]="egon"
    [root@aliyun ~]# info["age"]=18
    [root@aliyun ~]# info["gender"]="male"
    [root@aliyun ~]# 
    [root@aliyun ~]# declare -A |grep info
    declare -A info='([gender]="male" [name]="egon" [age]="18" )'
    [root@aliyun ~]# 
    [root@aliyun ~]# echo ${info[*]}
    male egon 18
    [root@aliyun ~]# 
    [root@aliyun ~]# echo ${info["name"]}
    egon
    

    四 遍历数组

    方法一: 利用获取所有信息进行遍历 (适用于普通数组与关联数组)

    # 例1
    declare -A array
    array=(["name"]="egon" ["age"]=18 ["gender"]="male")
    
    for item in ${array[*]}
    do 
        echo $item
    done
    
    # 例2
    array=("egon" 18 "male")
    for item in ${array[*]}
    do 
        echo $item
    done
    

    方法二: 通过数组元数的索引进行遍历(适用于普通数组与关联数组)

    # 例1
    declare -A array
    array=(["name"]="egon" ["age"]=18 ["gender"]="male")
    
    for i in ${!array[*]}  # echo ${!array[*]}  # 获取的是key信息:name age gender
    do 
        echo "$i:${array[$i]}"
    done
    
    # 例2
    array=("egon" 18 "male")
    for i in ${!array[*]}  # echo ${!array[*]} 直接获取所有元素的索引信息
    do 
        echo $i
        echo ${array[i]}
    done
    

    方法三:根据数组长度信息进行遍历,(适用于普通数组)

    array=("egon" 18 "male")
    
    for ((i=0;i<${#array[*]};i++))
    do 
        echo "$i:${array[$i]}"
    done
    

    五 练习

    练习1:对指定的IP地址进行网络测试

    #!/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@egon 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@egon test]# 
    [root@egon test]# ./a.sh 
    /sbin/nologin:41
    /bin/sync:1
    /bin/bash:2
    /sbin/shutdown:1
    /sbin/halt:1
    
  • 相关阅读:
    《人月神话》阅读笔记3
    第十五周总结
    《人月神话》阅读笔记2
    对正在使用的输入法评价
    课堂练习(找水王问题)
    第二阶段冲刺第十天
    第二阶段冲刺第九天
    第二阶段冲刺第八天
    第二阶段冲刺第七天
    openwrt U盘启动
  • 原文地址:https://www.cnblogs.com/caodan01/p/14949102.html
Copyright © 2011-2022 走看看