[ SHELL编程 ] 数组、关联数组和awk数组
本文主要对shell编程中常用的数组、关联数组和awk数组定义、操作以及注意事项做个总结,并提供具体案例。
数组
数组定义:一对圆括号表示数组,数组元素之间用空格符号分割。
Array=(val1 val2 val3)
数组操作:包括获取长度,数组元素查询、增加、删除、修改,获取数组下标
#获取数组长度 ${#Array[@]} #Arr表示数组名,下同 ${#Array[*]} #获取数组元素 ${Array[@]} #获取数组全部元素 ${Array[*]} #同上 ${Array[0]} #获取数组指定位置元素,下标从0开始 ${Array[*]:1:2} #获取指定范围的数组元素 #增加数组元素 Array[2]=oracle #原数组不存在下标为2 #修改数组元素 Array[2]=oracle #原数组存在下标为2,注意与增加方式的区别 #删除数组元素 unset Array[1] #带下标则为清除指定位置元素 unset Array #不带下标,清除全部数据 #替换操作,不会修改原数组元素 ${Array[@]/oracle/root} #获取数组下标 ${!Array[@]}
关联数组
数组定义:与普通数组区别就是可以用字符串作为数组下标,定义方式为用declare -A声明变量。
declare -A Array
数组操作:与普通数组相同,重点描述下编程中常用的根据指定的下标获取元素。关联数组默认输出的顺序是无序的。
for key in ${!Array[*]} do echo "The value of ${key} is ${Array[$key]}" done
awk数组
数组定义:默认为关联数组,下标可以是数字或者字符串,且不需要申明,可直接使用。特别一点是awk可以用split生成数组
#通过split函数间接生成数组 awk 'BEGIN{info="I LOVE CHINA";split(info,Array," ");}' #split为awk内置函数,info表示字符串,Array表示生成数组," "表示分隔符 #直接生成数组 awk 'BEGIN{for(i=0;i<=2;i++)Array[i]=i;}'
数组操作:部分操作与上述不同,下面描述一下
#获取数组长度 awk 'BEGIN{for(i=0;i<=2;i++)Array[i]=i;print length(Array)}' #调用内置函数length获取 awk 'BEGIN{info="I LOVE CHINA";len=split(info,Array," ");print len}' #split函数返回数组长度
操作实例
1、tcp端口状态统计
$ netstat -an | awk '/^tcp/ {++Arr[$NF]} END {for(a in Arr) print a, Arr[a]}' LISTEN 17 ESTABLISHED 54 SYN_SENT 2
2、将用户和用户家目录保存到数组,后续可根据用户名获取家目录。可根据具体场景修改如下代码
#!/bin/bash [ -f file.unl ] && rm file.unl awk -F':' '{print $1,$6}' /etc/passwd | head -n 3 > file.unl #only for test declare -A Arr while read col1 col2 do Arr[${col1}]=${col2} done < file.unl for user in ${!Arr[@]} do printf "The directory of ${user} is ${Arr[${user}]}\n" done
输出:
The directory of bin is /bin The directory of daemon is /sbin The directory of root is /root
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义