# 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)