linux shell 数组

  1. 数组基础概念

什么是数组

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

Shell数组特点

索引从0开始

可以存储不同类型的数据

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

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

  1. 数组声明和初始化

声明数组

方法1:直接声明

declare -a array_name

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

array_name=()

初始化数组

方法1:直接赋值

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

方法2:逐个元素赋值

fruits[0]="apple"

fruits[1]="banana"

fruits[2]="orange"

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

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

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

files=(*.txt)

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

  1. 数组操作

访问数组元素

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

访问单个元素

echo ${fruits[0]} # 输出: apple

echo ${fruits[1]} # 输出: banana

访问所有元素

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

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

数组长度

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

数组元素个数

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

单个元素的长度

echo ${#fruits[0]} # 输出: 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: {fruits[i]}"

done

方法2:直接遍历元素

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

echo "Fruit: $fruit"

done

方法3:遍历索引

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

echo "Index index: {fruits[index]}"

done

添加元素

fruits=("apple" "banana")

在末尾添加

fruits+=("orange")

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

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

fruits[1]="pear" # 替换banana为pear

删除元素

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

删除特定元素

unset fruits[1] # 删除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")

或者逐个赋值

person[name]="John"

person[age]="25"

person[city]="New York"

关联数组操作

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

访问元素

echo ${person[name]} # 输出: 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\]}:${config\[port\]}" echo "Username: ${config\[user\]}" 示例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\[@\]})

相关推荐
JZC_xiaozhong3 小时前
数据不互通、审批慢?企业多系统智能协同与流程自动化解决方案
运维·自动化·流程管理·流程自动化·数据集成与应用集成·流程监控·流程可视化设计
爱学习的小囧3 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
坚持就完事了3 小时前
Linux中的变量
linux·运维·服务器
hERS EOUS3 小时前
nginx 代理 redis
运维·redis·nginx
handler014 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
Cat_Rocky4 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志4 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子4 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
Qbw20045 小时前
【Linux】进程地址空间
linux·c++
忍冬行者5 小时前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb