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\[@\]})

相关推荐
刚入门的大一新生1 小时前
Linux-Linux的基础指令4
linux·运维·服务器
腾讯蓝鲸智云4 小时前
嘉为蓝鲸可观测系列产品入选Gartner《中国智能IT监控与日志分析工具市场指南》
运维·人工智能·信息可视化·自动化
路溪非溪6 小时前
Linux下蓝牙框架的数据流
linux·arm开发·驱动开发
能不能别报错6 小时前
openclaw-linux部署教程+mimo-v2-pro
linux·运维·服务器
小虎卫远程打卡app7 小时前
光通信与视频编码前沿技术综述:从超大容量传输到实时神经网络编码
运维·网络·信息与通信·视频编解码
钛态7 小时前
Flutter for OpenHarmony:mockito 单元测试的替身演员,轻松模拟复杂依赖(测试驱动开发必备) 深度解析与鸿蒙适配指南
服务器·驱动开发·安全·flutter·华为·单元测试·harmonyos
ToB营销学堂7 小时前
B2B营销自动化新解法:MarketUP聚焦高转化场景
大数据·运维·自动化
TK云大师-KK7 小时前
TikTok自动化直播遇到内容重复问题?这套技术方案了解一下
大数据·运维·人工智能·矩阵·自动化·新媒体运营·流量运营
济6177 小时前
ARM Linux 驱动开发篇---基于 pinctrl+GPIO 子系统的蜂鸣器驱动开发(设备树版)--- Ubuntu20.04
linux·嵌入式·嵌入式linux驱动开发
AiGuoHou17 小时前
Debian/Ubuntu 各个版本一键更换国内镜像源
linux·ubuntu·国内源·debian·镜像源·换源