linux shell 数组

  1. 数组基础概念

什么是数组

数组是一种数据结构,用于存储多个相同类型的值。在Shell中,数组可以存储字符串、数字等数据类型

Shell数组特点

索引从0开始

可以存储不同类型的数据

大小不固定,可以动态扩展

支持稀疏数组(不连续的索引)\

  1. 数组声明和初始化

声明数组

方法1:直接声明

declare -a array_name

方法2:隐式声明(直接赋值)

array_name=()

初始化数组

方法1:直接赋值

fruits=("apple" "banana" "orange")

方法2:逐个元素赋值

fruits0="apple"

fruits1="banana"

fruits2="orange"

方法3:使用索引赋值(创建稀疏数组)

colors=(0="red" 2="green" 5="blue")

方法4:从命令输出初始化

files=(*.txt)

processes=((ps aux \| awk '{print 2}'))

  1. 数组操作

访问数组元素

fruits=("apple" "banana" "orange")

访问单个元素

echo ${fruits0} # 输出: apple

echo ${fruits1} # 输出: banana

访问所有元素

echo ${fruits@} # 输出所有元素

echo ${fruits\*} # 输出所有元素

数组长度

fruits=("apple" "banana" "orange")

数组元素个数

echo ${#fruits@} # 输出: 3

单个元素的长度

echo ${#fruits0} # 输出: 5 (apple的长度)

数组切片

fruits=("apple" "banana" "orange" "grape" "mango")

切片:从索引1开始,取2个元素

echo ${fruits@:1:2} # 输出: banana orange

切片:从索引2开始到结束

echo ${fruits@:2} # 输出: orange grape mango

数组遍历

fruits=("apple" "banana" "orange")

方法1:使用索引遍历

for ((i=0; i<${#fruits@}; i++)); do

echo "Element i: {fruitsi}"

done

方法2:直接遍历元素

for fruit in "${fruits@}"; do

echo "Fruit: $fruit"

done

方法3:遍历索引

for index in "${!fruits@}"; do

echo "Index index: {fruitsindex}"

done

添加元素

fruits=("apple" "banana")

在末尾添加

fruits+=("orange")

fruits${#fruits\[@}]="grape"

在特定位置添加(如果索引存在则替换)

fruits1="pear" # 替换banana为pear

删除元素

fruits=("apple" "banana" "orange")

删除特定元素

unset fruits1 # 删除banana

echo ${fruits@} # 输出: apple orange

echo ${!fruits@} # 输出: 0 2 (索引不连续)

删除整个数组

unset fruits

  1. 关联数组

声明和初始化关联数组

声明关联数组(必须使用declare -A)

declare -A person

初始化

person=(name="John" age="25" city="New York")

或者逐个赋值

personname="John"

personage="25"

personcity="New York"

关联数组操作

declare -A person=(name="John" age="25" city="New York")

访问元素

echo ${personname} # 输出: John

获取所有键

echo ${!person@} # 输出: name age city

获取所有值

echo ${person@} # 输出: John 25 New York

遍历关联数组

for key in "${!person@}"; do

echo "key: {person$key}"

done

实用示例

示例1:处理文件列表

#!/bin/bash

获取当前目录下的所有.txt文件

txt_files=(*.txt)

echo "Found ${#txt_files@} text files:"

for file in "${txt_files@}"; do

echo " - $file"

对每个文件进行操作

wc -l "$file"

done

示例2:配置参数处理

#!/bin/bash

配置文件参数

declare -A config

config=(

host="localhost"

port="8080"

user="admin"

password="secret"

)

使用配置

echo "Connecting to {config\[host\]}:{configport}"

echo "Username: ${configuser}"

示例3:统计单词频率

#!/bin/bash

text="apple banana apple orange banana apple"

将文本转换为数组

words=($text)

declare -A frequency

统计频率

for word in "${words@}"; do

((frequency$word++))

done

输出结果

for word in "${!frequency@}"; do

echo "word: {frequency$word}"

done

示例4:菜单系统

#!/bin/bash

options=("Option 1" "Option 2" "Option 3" "Quit")

echo "Please select an option:"

select option in "${options@}"; do

case $option in

"Option 1")

echo "You selected Option 1"

;;

"Option 2")

echo "You selected Option 2"

;;

"Option 3")

echo "You selected Option 3"

;;

"Quit")

break

;;

*)

echo "Invalid option"

;;

esac

done

注意事项

引号的使用

array=("item 1" "item 2" "item 3")

正确:保留元素中的空格

for item in "${array@}"; do

echo "$item"

done

错误:元素中的空格会被分割

for item in ${array@}; do

echo "$item"

done

original=("a" "b" "c")

copy=("${original@}") # 正确复制数组

错误的方式(会合并所有元素)

wrong_copy=(${original@})

相关推荐
波力海苔夹心脆6754 小时前
C# 固高 GTS 运动控制卡入门:伺服上下电、Jog 点动与二维插补(WinForms 实战)
服务器·开发语言·c#·运动控制·伺服电机·winforms·固高
一只鹿鹿鹿4 小时前
医院绩效管理体系方案
大数据·运维·安全·web安全·制造
java_logo4 小时前
Docker 部署 Portainer CE 中文版:轻松搭建容器管理平台
运维·docker·容器·portainer·容器管理·轩辕镜像·portainer ce
山东孙燕姿4 小时前
前端框架升级:不敢动的组件怎么办
大数据·运维·服务器·网络·人工智能·前端框架
古法老登瞎折腾12 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
琥珀.13 小时前
mysql中json数组转列表查询
linux·运维·服务器
dawnsky.liu13 小时前
在 RHEL 中使用 goose 实现远程主机管理
linux·运维·ai
Linux运维技术栈15 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
云边云科技_云网融合16 小时前
连锁门店组网怎么做?SD-WAN 多分支组网的架构选型、部署与成本结构
服务器·数据库·php
云上先途116 小时前
企业 AI 服务部署周期多久,会不会影响原有业务运转?
大数据·运维·人工智能