数组声明与删除

declare -a array_name       # 声明数组,也可以不声明
declare -a nums=(1 2 3 4)   # 声明数组,同时也可给数组赋值
unset array_name            # 删除数组
unset nums[0]               # 删除数组中的某个元素

备注:

数组可以不声明直接赋值

数组中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推

声明字典

declare -A dict_name                         # 声明字典
declare -A dict_name=([name]=Alice [age]=18) # 声明字典,并赋值

备注:

字典类型必须显式声明才能使用

数组赋值

# 方式一
array_name=(
value0
value1
value2
value3
)

# 方式二
names=(Jerry Alice David Wendy)

# 方式三
names[0]=Jerry
names[1]=Alice
names[2]=David
names[3]=Wendy

# 方式四
names=([0]=Jerry [1]=Alice [2]=David [3]=Wendy)

# 方式五
str="Jerry Alice David Wendy"
names=($str)

备注:

数组中的元素,必须以空格来隔开

定义数组其索引,可以不按顺序来定义,比如说:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy)

数组新增元素

# 方式一
names=("$names[@]" Tom)

# 方式二
names[${#names[@]}]=Tom  # 此方式仅使用于数组下标是从0开始的连续下标

# 如果要在某个指定的元素后面插入新元素,则要遍历数组做判断操作

字典赋值

# 方式一
declare -A dict_name=(
[name]=Alice
[age]=18
)

# 方式二
declare -A dict_name
dict_name[name]=Alice
dict_name[age]=18

备注:

必须使用declare -A声明为字典类型才能使用

数组长度

# 示例数组
names=(Jerry Alice David Wendy)

# 计算数组元素的有效个数
${#names[@]}
# 等价方式
${#names[*]}

# 备注:
# 有效个数是指数组的真实元素个数,于数组的最大下标无关
# 举个例子,定义数组:arr=([0]=One [9]=Two)
# 这个数组的有效个数是2,而最大下标是9

# 补充:计算元素的长度,相当于求字符串的长度
# 方式一
${#names[0]}  # 求数组下标为0的元素的长度,下同
# 方式二
expr length "${names[0]}"
# 方式三
echo "${names[0]}" | wc -L
# 方式四
echo -n "${names[0]}" | wc -c
# 方式五
expr "${names[0]}" : ".*"
# 方式六
echo "${names[0]}" | awk '{print length($0)}'

字符串转数组

# 以空格分隔的字符串
str="1 2 3 4"
arr=($str)

# 以指定字符分隔
str="1.2.3.4"
# 方式一
arr=(${str//./ })
# 方式二
arr=($(echo $str|tr '.' ' '))
# 方式三
arr=($(echo $str|sed 's/\./ /g'))

# 方法有很多,无非就是把分割字符替换成空格

删除数组元素

# 示例数组
names=(Jerry Alice David Wendy)

# 删除元素
unset names[0]

遍历数组

# 方式一
for item in "${names[@]}"; do
    #do something
    echo "$item"
done

# 方式二
for index in "${!names[@]}"; do
    #do something
    echo "${names[$index]}"
done

# 使用误区
for ((i=0;i<${#names[@]};i++)); do
    #do something
    echo "${names[$i]}"
done
# 有的文章提供了这种的遍历方式,使用上是可能会出问题的
# 如:数组定义:arr=([0]=One [9]=Two)
# 执行结果就不正确了。也就是说这种方式只适用于数组是从0开始的连续连续下标

数组取值和切片

# 示例数组
arr=(Jerry Alice David Wendy)

# 取值
$arr             # 取数组下标为0的元素,是${names[0]}的简写
${arr[0]}        # 取数组下标为0的元素
${arr[@]}        # 取出所有元素
${arr[@]:(-1)}   # 取最后一个元素

# 切片
${arr[@]:1}      # 从索引为1到后面的所有元素
${arr[@]:1:2}    # 从索引为1开始取,取2个元素
${arr[@]::2}     # 取前2个元素,是${arr[@]:0:2}的简写
${arr[@]:0:2}    # 取前2个元素
${arr[@]:(-2):2} # 从最大索引-2+1开始取,取2个元素

标签: none

添加新评论