shell脚本中实现数组变量

简介: shell 数组变量普通数组:只能使用整数作为数组索引关联数组:可以使用字符串作为数组索引数组变量和普通变量的区别:最明显的曲边就是普通变量一次只能设置一个变量值,而数组可以有多个值,例如普通变量(ip=192.168.81.210),数组变量(ip=(192.168.81.210 192.168.81.220)),普通变量是按一个字符当做一个索引位,而数组变量是一个字符串作为一个变量,另外普通变量的索引位都是整数,从0开始,而数组变量可以是整数也可以是字符串,这就要说到关联数组,例如(info=([name]tianyun [sex]male))

shell 数组变量

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

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

数组变量和普通变量的区别:最明显的曲边就是普通变量一次只能设置一个变量值,而数组可以有多个值,例如普通变量(ip=192.168.81.210),数组变量(ip=(192.168.81.210 192.168.81.220)),普通变量是按一个字符当做一个索引位,而数组变量是一个字符串作为一个变量,另外普通变量的索引位都是整数,从0开始,而数组变量可以是整数也可以是字符串,这就要说到关联数组,例如(info=([name]tianyun [sex]male))


1.普通数组

定义数组:


方法一:一次性赋一个值


格式:数组名[下标/索引]=变量值


例子:array1[0]=pear


array1[1]=apple


array1[2]=orange


array1[3]=peach


默认只输出第一个索引


查看数组


1:declare -a | grep 数组名


2:echo a r r a y [ @ ] 查 看 数 组 中 的 所 有 值 , e c h o {array[@]}查看数组中的所有值,echoarray[@]查看数组中的所有值,echo{array[1]}以索引位进行显示


方法二:一次赋多个值


格式:数组名=(变量值1 变量值2)


例子:array2=(tom jack alice)


array3=($(cat /etc/passwd)) 希望以文件中的每行作为一个元数赋值给数组array3,但是文件中可能存在空格或者空行,因此可以使用IFS重新定义分隔符

[root@localhost ~]# array4=($(ls /var/ftp/Shell/for*))
[root@localhost ~]# array5=(tom jack alice "bash shell")
[root@localhost ~]# colors=($red $blue $gree $recolor)
[root@localhost ~]# array6=(1 2 3 4 5 6 7 "linux shell" [20]=saltstack)

2.关联数组

关联数组与普通数组不同之处在于,关联数组的索引不再是默认的整数,而是由管理员自己定义


格式:数组名=([][][索引1]=元数值 [索引2]=元数值)


像存在的数组中增加索引:数组名+=([索引3]=元数值)


例如:userinfo=([user]=jiangxiaolong [age]=20 [sex]=boy)


userinfo+=([sy]=yunwei)


shuzu2=’([0]=“zero” [1]=“one” [2]=“two” [3]=“three” [4]=“four” [5]=“five” [6]=“six”)’


declare -a shuzu3=’([0]=“1” [1]=“2” [2]=“3” [3]=“4” [4]=“5” [5]=“6” [6]=“7” [7]=“linux shell” [20]=“tomcat”)


3.查看数组:

[root@localhost ~]# declare -a
  declare -a shuzu2='([0]="zero" [1]="one" [2]="two" [3]="three" [4]="four" [5]="five" [6]="six")'
  declare -a shuzu3='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="linux shell" [20]="tomcat")'

4.访问数组元数:

[root@localhost ~]# echo ${array1[0]} 访问数组中的第一个元数
[root@localhost ~]# echo ${array1[@]}   访问数组中的所有元数,等同于echo ${array1[*]}
[root@localhost ~]# echo ${#array1[@]}  统计数组中元素的个数
[root@localhost ~]# echo ${!arrar2[@]}  获取数组元数的索引
[root@localhost ~]# echo ${array1[@]:1} 从数组下标1开始,也就是除了索引位0,其余都会显示
[root@localhost ~]# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素,也就是从索引1开始往后显示2个

5.案例

5.1数组的赋值及遍历

#!/bin/bash
#-------------------数组的赋值及遍历-------------------------
#20200217
while read line
do
        hosts[++i]=$line        #++i表示先运算在赋值,i默认为0,因此第一个i的值为1,如果是i++则是先赋值在运算,也就是第一个值为0
done </etc/hosts
echo "hosts first: ${hosts[1]}"         #输出数组中的第一个元数值
for i in ${!hosts[@]}                   #输出数组中的索引位,这是普通数组也就是1,2,3...
do
        echo "$i: ${hosts[i]}"          #${hosts[i]}中的i就是变量i,可以不加$符号,因为前面已经有了
done
echo
echo
echo
#----------------------------for实现数组的赋值及赋值------------------------
OLD_IFS=$IFS                            #定义之前已经设置好的IFS分隔符,默认以空格分隔
IFS=$'\n'                               #定义新的分隔符,以换行为准
for line in `cat /etc/hosts`            
do
        hosts[j++]=$line                #j++,先赋值在运算,从0开始
done
for e in ${!hosts[@]}
do
        echo "$e: ${hosts[e]}"
done
IFS=$OLD_IFS                            #仅给某一段更改分隔符,下面的代码不需要更换换行符,因此在这里换回来

5.2统计性别出现的次数

统计某一个文件中某种类型出现的次数


实现方法:把要统计的对象作为数组的索引,把它的值没出现一次就累加1


定义一个关联数组


declare -A sex


sex=([boy]=1) 将索引为boy的元数值设置为1


sex+=([girl]=1) 在sex数组中新增一个元数,并将索引为gril的元数值设置为1


let sex[boy]++ 将索引位boy的元数值每次加1


let sex[qt]++ 这种方法也可以增加一个元数,但是值只能是数字,如果想其他值可以用sex+=的方式设置

#!/bin/bash
declare -A sex
while read line
do
  index=$(echo $line | awk '{print $1}'   获取索引位
  let sex[index]++    每当index被赋值后,对应的索引位boy\gril的元数值每次加1,默认是0,加的是元数值而不是新的元数
done <sex.txt
for i in ${!sex[@]}
do
  echo "$i: ${sex[$i]}"   注意在i前面加上$
done
输出结果
girl: 4
boy: 3

5.3统计不同类型的shell数量

#!/bin/bash                                                                        
#-------------------统计不同类型的shell数量------------------                      
#20200218                                                                          
declare -A shells                                                                  
while read line                                                                    
do                                                                                 
        index=`echo $line |awk -F ":" '{print $NF}'`  #读到每行的最后一列赋给索引  
        let shells[$index]++    #默认元数值为1,每当读到一样的索引位时元数值就加1                 
done < /etc/passwd                                                                 
for i in ${!shells[@]}          #取出索引位                                        
do                                                                                 
        echo "$i: ${shells[$i]}"                                                   
done  

5.4统计tcp连接状态的数量

方法1,使用watch不停执行
watch -n1 ./count_tcp.sh
#!/bin/bash
#-----------------------统计tcp连接状态数量-----------------------
declare -A status
index_type=`ss -an | awk '{print $2}'`
for i in $index_type
do
  let status[$i]++
done
for j in ${!status[@]}
do
    echo "$j: ${status[$j]}"
done
方法2,使用while循环执行不停执行
#!/bin/bash
#-----------------------统计tcp连接状态数量-----------------------
while :
do
        unset status
        declare -A status
        index_type=`ss -an | awk '{print $2}'`
        for i in $index_type
        do
                let status[$i]++
        done
        for j in ${!status[@]}
        do
                echo "$j: ${status[$j]}"    $j前面必须加$否则会读不到数
        done
        sleep 1;clear
done
目录
相关文章
|
3天前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
1月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
97 32
|
14天前
|
JavaScript Shell C#
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
91 1
|
5月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
161 1
|
5月前
|
存储 Shell
Shell 数组
【10月更文挑战第16天】
65 3
|
4月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
121 2
6种方法打造出色的Shell脚本
|
4月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
177 1
|
4月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
152 2
|
5月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
110 6
|
4月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。