1. 数组基本概述

什么是数组

简单来讲:数组其实就是变量的一种,变量只能存储一个值,而数组可以存储多个值

数组的分类

分为两类  普通数组  关联数组

普通数组:只能使用正整数作为数组索引

关联数组:可以使用字符串作为数组索引

2. 数组的基本使用

#定义普通数组

[root@shell /scripts/shell12]# #定义数组
[root@shell /scripts/shell12]# #声明数组  declare -a  数组名   普通数组无需声明

#第一种定义方式
[root@shell /scripts/shell12]# shuzu_1[0]=nginx
[root@shell /scripts/shell12]# shuzu_1[1]=php-fpm
[root@shell /scripts/shell12]# shuzu_1[2]=mysql

#第二种定义方式,一次定义多个值

[root@shell /scripts/shell12]# shuzu_2=(oldboy oldgirl oldqiu)

#第三种 通过命令的执行结果进行定义  默认以空白字符为分隔符
[root@shell /scripts/shell12]# shuzu_3=($(cat /etc/hosts))

#第四种方式  自定义索引序列号

[root@shell /scripts/shell12]# shuzu_4=(beijing shanghai [5]=wuhan [10]=nanjing)


#访问数组中的内容

#打印数组中所有的值
[root@shell /scripts/shell12]# echo ${shuzu_1[@]}
nginx php-fpm mysql
[root@shell /scripts/shell12]# echo ${shuzu_1[*]}
nginx php-fpm mysql

#打印数组的所有的索引
[root@shell /scripts/shell12]# echo ${!shuzu_1[@]}
0 1 2
[root@shell /scripts/shell12]# echo ${!shuzu_4[@]}
0 1 5 10
[root@shell /scripts/shell12]# echo ${!shuzu_3[@]}
0 1 2 3 4 5 6 7 8 9


#打印数组的元数个数  索引的个数
[root@shell /scripts/shell12]# echo ${#shuzu_1[@]}
3
[root@shell /scripts/shell12]# echo ${#shuzu_3[@]}
10

#显示定义的普通数组
[root@shell /scripts/shell12]# declare -a

#取出数组中单个的值
[root@shell /scripts/shell12]# echo ${shuzu_1[0]}
nginx
[root@shell /scripts/shell12]# echo ${shuzu_1[1]}
php-fpm
[root@shell /scripts/shell12]# echo ${shuzu_1[2]}
mysql

#打印数组中的从索引1开始打印,显示所有
[root@shell /scripts/shell12]# echo ${shuzu_1[@]:1}
php-fpm mysql
#打印数组中的从索0开始打印,显示所有
[root@shell /scripts/shell12]# echo ${shuzu_1[@]:0}
nginx php-fpm mysql

#打印数组从索引0开始,打印1个索引  前面对应的是索引的序列号  后面对应的是个数

[root@shell /scripts/shell12]# echo ${shuzu_1[@]:0:1}
nginx

[root@shell /scripts/shell12]# echo ${shuzu_1[@]:0:2}
nginx php-fpm
[root@shell /scripts/shell12]# echo ${shuzu_1[@]:0:3}
nginx php-fpm mysql

#关联数组

#定义关联数组

#第一种定义方式
[root@shell ~]# #定义关联数组时!需要声明
[root@shell ~]# declare  -A  shuzu_1
[root@shell ~]# declare  -A  shuzu_2
[root@shell ~]# shuzu_1[name]=qiudao
[root@shell ~]# shuzu_1[age]=18
[root@shell ~]# shuzu_1[skill]=linux

#第二种定义方式
[root@shell ~]# shuzu_2=([index1]=nginx [index2]=mysql [index3]=php)

#显示所有已定义的关联数组
[root@shell ~]# declare -A

#如何访问关联数组里面的内容

#显示关联数组中的索引元数个数
[root@shell ~]# echo ${#shuzu_2[@]}
3
#显示所有索引
[root@shell ~]# echo ${!shuzu_2[@]}
index1 index2 index3

[root@shell ~]# echo ${!shuzu_1[@]}
name age skill

#显示所有值
[root@shell ~]# echo ${shuzu_1[@]}
qiudao 18 linux

#显示单个的值
[root@shell ~]# echo ${shuzu_1[name]}
qiudao
[root@shell ~]# echo ${shuzu_1[age]}
18

3. 数组的遍历与循环

1. 普通数组赋值与遍历

/etc/hosts

[root@shell /scripts/shell12]# cat array-1.sh
#!/bin/bash
#1.通过while循环进行取值
while read line
do
    #2.定义一个普通数组
    hosts[i++]=$line
    #hosts[1]=test
done < /etc/hosts
#通过循环进行遍历
for i in ${!hosts[@]}
do
    echo "hosts数组的索引为$i ,对应值为:${hosts[i]}"  
done
[root@shell /scripts/shell12]# sh array-1.sh
hosts数组的索引为0 ,对应值为:127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
hosts数组的索引为1 ,对应值为:::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

2. 使用关联数组统计/etc/passwd文件中的每一个shell的数量

/bin/bash  

[root@shell /scripts/shell12]# awk -F: '{print $NF}' /etc/passwd| sort | uniq -c
     30 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     22 /sbin/nologin
      1 /sbin/shutdown

[root@shell /scripts/shell12]# cat array-2.sh
#!/bin/bash
#1.声明关联数组
declare -A  Shell_count
#2.对数组进行赋值
while read line
do
    Type=$(echo $line|awk -F: '{print $NF}')
    let Shell_count[$Type]++
done < /etc/passwd
#3.遍历
for i in ${!Shell_count[@]}
do
    echo "Shell:$i , Count:${Shell_count[$i]}"
done
[root@shell /scripts/shell12]# sh array-2.sh
Shell:/sbin/nologin , Count:22
Shell:/bin/sync , Count:1
Shell:/bin/bash , Count:30
Shell:/sbin/shutdown , Count:1
Shell:/sbin/halt , Count:1


[root@shell /scripts/shell12]# declare -A  Shell_count
[root@shell /scripts/shell12]# Shell_count=([/sbin/nologin]=1 [/bin/sync]=1 [/bin/bash]=1 [/sbin/shutdown]=1 [/sbin/halt]=1)
[root@shell /scripts/shell12]# let Shell_count[/sbin/nologin]++
[root@shell /scripts/shell12]# let Shell_count[/sbin/nologin]++
[root@shell /scripts/shell12]# let Shell_count[/sbin/nologin]++
[root@shell /scripts/shell12]# let Shell_count[/sbin/nologin]++
[root@shell /scripts/shell12]# echo ${Shell_count[/sbin/nologin]}
5
[root@shell /scripts/shell12]# let Shell_count[/bin/bash]++
[root@shell /scripts/shell12]# let Shell_count[/bin/bash]++
[root@shell /scripts/shell12]# let Shell_count[/bin/bash]++
[root@shell /scripts/shell12]# let Shell_count[/bin/bash]++
[root@shell /scripts/shell12]# let Shell_count[/bin/bash]++
[root@shell /scripts/shell12]# echo ${Shell_count[/bin/bash]}
6

3. 根据访问日志,统计出每个IP的访问次数

[root@shell /scripts/shell12]# cat array-3.sh
#!/bin/bash
#1.声明关联数组
declare -A Ips_count
>ip.log
#2.进行循环赋值
while read line 
do
    #Ip=$(echo $line | awk '{print $1}')
    let Ips_count[${line%% *}]++
done <access.log
#3.进行索引遍历
for i in  ${!Ips_count[@]}
do
    echo -e "IP:$i\tCount:${Ips_count[$i]}" >>ip.log
done

sort -t ':' -rnk3 ip.log |head
练习题
[root@shell /scripts/shell12]# cat tcp11.sh
#!/bin/bash
#1.声明关联数组
declare -A Tcp_State 
#2.定义变量
Status=$(netstat  -ant | awk 'NR>2{print $NF}')
#3.循环赋值
for i in $Status
do
    let Tcp_State[$i]++
done
#4.索引遍历
for i in ${!Tcp_State[@]}
do
    echo -e  "当前Tcp状态为:$i\t\t出现的次数为:${Tcp_State[$i]}"
done
[root@shell /scripts/shell12]# sh tcp11.sh
当前Tcp状态为:ESTABLISHED        出现的次数为:2
当前Tcp状态为:LISTEN        出现的次数为:9


1. 使用while循环编写一个脚本,使数字1加到100的和

[root@shell /scripts/shell13]# cat while-1.sh
#!/bin/bash
i=1
while [ $i -le 100 ]
do
    Sum=$[ $Sum + $i ]
    let i++
done
echo $Sum
[root@shell /scripts/shell13]# sh while-1.sh
5050

2. 生成0-100之间的随机数,并将其相加,直到大于1000.输入相加的结果

[root@shell /scripts/shell13]# cat while-2.sh
#!/bin/bash
while true
do
    Ran=$(( RANDOM % 101 ))
    Sum=$(( $Sum + $Ran ))
    if [ $Sum -gt 1000 ];then
        echo "最后的和为:$Sum"
        exit
    fi
done
[root@shell /scripts/shell13]# sh while-2.sh
最后的和为:1025

3. 生成0-100之间的随机数,并将其相加,直到大于1000退出,再判断最后一个随机数是否被3整除

[root@shell /scripts/shell13]# cat while-3.sh
#!/bin/bash
while true
do
    Ran=$(( RANDOM % 101 ))
    Sum=$(( $Sum + $Ran ))
    if [ $Sum -gt 1000 ];then
        break
    fi
done
Zhengshu=$(( $Ran % 3 ))
if [ $Zhengshu -eq 0 ];then
    echo "最后一个随机数是可以被3整除的!这个随机数为:$Ran"
else
    echo "最后一个随机数是不可以被3整除!这个随机数为:$Ran"
fi
[root@shell /scripts/shell13]# sh while-3.sh
最后一个随机数是不可以被3整除!这个随机数为:95
[root@shell /scripts/shell13]# sh while-3.sh
最后一个随机数是不可以被3整除!这个随机数为:49
[root@shell /scripts/shell13]# sh while-3.sh
最后一个随机数是可以被3整除的!这个随机数为:99
Copyright © 高程程 all right reserved,powered by Gitbook修订于: 2021-05-18 21:14:44

results matching ""

    No results matching ""