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

相关推荐
唐青枫1 小时前
别再只会用 cron:Linux systemd Timer 定时任务实战详解
linux
AlfredZhao2 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐3 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698034 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297914 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Web3探索者6 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo6 天前
Linux系统中网线与USB网络共享冲突
linux
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计