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@})

相关推荐
研华科技Advantech3 小时前
案例 | 从离线巡检到在线看护:研华PHM解决方案赋能石油钻井平台智能运维
运维·人工智能·边缘计算
難釋懷3 小时前
Nginx主动健康检查
运维·nginx
ITyunwei09874 小时前
内存溢出报错,实战处理记录
运维·服务器·企业微信
Elastic 中国社区官方博客4 小时前
你的 AI agent 不需要你的 API 密钥:使用 OAuth 2.1 对 Elasticsearch MCP 服务器进行身份验证
大数据·运维·人工智能·elasticsearch·搜索引擎·全文检索
FreeTinker4 小时前
AP AC组网中的远程运维挑战及内网穿透技术应用分析
运维
谷哥的小弟5 小时前
腾讯云服务器安装Redis Stack图文教程
服务器·redis·腾讯云·redis stack
发量惊人的中年网工5 小时前
中小企业网络管理进阶:从设备堆叠到统一管理
服务器·网络·安全·网络安全·php·制造
Huangjin007_5 小时前
【Linux 系统篇(十五)】进程 (三) :进程状态深度详解
linux·运维
RisunJan6 小时前
Linux命令-talk(终端实时对话)
linux·运维·服务器
NeilYuen6 小时前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存