# 6、数组

# 定义数组、基本使用

在Linux中,可以使用以下方式定义和使用数组:

# 定义数组
array=("apple" "banana" "orange")

# ========================================= #
# 使用索引访问数组元素
echo ${array[0]} # 输出:apple

# 使用`*`或`@`可以获取数组中的所有元素
echo ${array[*]} # 输出:apple banana orange

# 使用`#`可以获取数组的长度
echo ${#array[@]}  # 输出:3

# 使用`+=`可以向数组中添加元素
array+=("grape")
echo ${array[*]} # 输出:apple banana orange grape

# 使用`unset`可以删除数组中的元素
unset array[1]
echo ${array[*]} # 输出:apple orange grape
# ========================================= #

# 数组遍历

# 方式一:遍历元素

array=("apple" "banana" "orange")

# 使用循环遍历数组中的元素
for item in ${array[*]}; do
    echo $item
done

# 方式二:索引遍历

#!/bin/bash

# 定义一个数组
my_array=("value1" "value2" "value3")
# 获取数组长度
length=${#my_array[@]}
# 循环遍历数组
for ((i=0; i<$length; i++))
do
    # 获取索引和值
    index=$i
    value=${my_array[$i]}
    
    # 输出索引和值
    echo "Index: $index, Value: $value"
done

# 方式三:遍历元素split效果

特殊格式的数组元素循环,split效果

#!/bin/bash

# 定义一个数组
my_array=(
    "key1=value1"
    "key2=value2"
    "key3=value3"
)
# 循环遍历数组
for item in "${my_array[@]}"
do
    # 使用IFS(内部字段分隔符)将键和值分割开
    IFS='=' read -ra array <<< "$item"
    key="${array[0]}"
    value="${array[1]}"
    
    # 输出键和值
    echo "Key: $key, Value: $value"
done

# 字符串分割成数组

使用read命令结合循环结构来遍历以英文逗号分割的字符串

#!/bin/bash

# 定义一个包含逗号分割值的字符串
str="apple,banana,orange,grape"

# 使用IFS(内部字段分隔符)将字符串按逗号分割成数组
IFS=',' read -ra arr <<< "$str"

# 循环遍历数组中的每个值
for item in "${arr[@]}"; do
    echo "$item"
done

# 数组去重

# 方式一:printf配合 sort和uniq

#!/bin/bash

# 定义一个包含重复元素的数组
arr=("apple" "banana" "orange" "apple" "grape" "banana")

# 使用sort和uniq命令去除重复元素
sorted_arr=($(printf "%s\n" "${arr[@]}" | sort | uniq))

# 打印去重后的数组
echo "${sorted_arr[@]}"

# 方式二:数组属性赋值方式

#!/bin/bash

# 定义一个包含重复元素的数组
arr=("apple" "banana" "orange" "apple" "grape" "banana")

# 声明关联数组
declare -A unique_arr

# 遍历原始数组,将每个元素作为关联数组的键,如果键不存在,则将其值设置为1,否则将其值递增1
for item in "${arr[@]}"; do
    unique_arr["$item"]=1
done

# 打印去重后的数组(关联数组的键即为去重后的元素)
echo "${!unique_arr[@]}"

# 数组拷贝

在操作数组前拷贝一份数组是一种常见的做法,可以避免直接修改原始数组,从而避免循环过程中出现异常。

你可以使用以下代码来复制一个数组:

# 原始数组
original_array=("element1" "element2" "element3")

# 复制数组
copied_array=("${original_array[@]}")

# 在复制的数组上进行操作
for element in "${copied_array[@]}"; do
  echo $element
done

# 关联数组(属性赋值)

关联数组允许你将键与值相关联,类似于Map数据结构。

# 要在Shell中使用关联数组,首先需要声明一个关联数组变量。以下是一个示例:
declare -A map_array

# 接下来,你可以通过键来添加或修改关联数组中的值。以下是一个示例:
map_array["key1"]="value1"
map_array["key2"]="value2"

# 要获取关联数组中的值,可以使用键来索引关联数组。以下是一个示例:
value1="${map_array["key1"]}"
value2="${map_array["key2"]}"

# 要删除关联数组中的键值对,可以使用`unset`命令。以下是一个示例:
bashunset "map_array["key1"]"

# 要遍历关联数组中的所有键值对,可以使用循环结构。以下是一个示例:
for key in "${!map_array[@]}"; do
	echo "Key: $key, Value: ${map_array[$key]}"
done

以上就是在Shell中使用关联数组作为Map数据结构的基本用法。通过使用关联数组,你可以在Shell中实现类似Map数据结构的操作。

# 数组合并

# 定义两个数组
array1=("元素1" "元素2" "元素3")
array2=("元素4" "元素5" "元素6")

# 合并数组
array3=("${array1[@]}" "${array2[@]}")

# 打印合并后的数组
echo "${array3[@]}"

//元素1 元素2 元素3 元素4 元素5 元素6



# 定义两个数组
array1=("元素1" "元素2" "元素3")
array2=("元素4" "元素5" "元素6")

# 合并数组并修改原始数组
array1=("${array1[@]}" "${array2[@]}")

# 打印合并后的数组
echo "${array1[@]}"

//元素1 元素2 元素3 元素4 元素5 元素6 
#!/bin/bash

# 定义两个数组
array1=("element1" "element2" "element3" "element4")
array2=("element3" "element4" "element5" "element6")

# 将两个数组连接并转换为换行符分隔的形式
combined_array=$(echo "${array1[@]}" "${array2[@]}" | tr ' ' '\n' | sort | uniq)
更新时间: 2024年2月23日星期五凌晨12点17分