Shell 学习(11)Bash 的数组

创建数组

1. 顺序赋值
单个赋值
orderArr[0]="element1"
orderArr[1]="element2"
orderArr[2]="element3"
一次性赋值

orderArr2=(element1 element2 element3)

2. 无序赋值
指定位置赋值

disorderArr2=(element1 [5]=element2 element3)

(element1 的索引为0,element3 的索引为 6)

一次性指定位置赋值
disorderArr=([6]=saturday [5]=friday [4]=thursday 
    [3]=wednesday [0]=sunday [1]=monday [2]=tuesday)
3. 通过 declare 命令声明一个普通数组
普通数组(即同前面创建的数组)

declare -a declareArr

4. 通过扩展声明一个数组
#!/bin/bash

numArr=({0..10})
alpArr=({a..k})
fileArr=( *.sh )

echo ${numArr[@]}
echo ${alpArr[@]}
echo ${fileArr[@]}

输出:

0 1 2 3 4 5 6 7 8 9 10
a b c d e f g h i j k
func.sh test.sh
5. 关联数组

declare -A declareArr

关联数组是一个允许非整数为下标索引的数组,可以理解为一个Map。

#!/bin/bash

declare -A arr

arr["name"]=C99
arr["age"]=22
arr[1]=100

echo ${arr["name"]}
echo ${arr["age"]}
echo ${arr[1]}
6. Copy 创建一个数组

${copyArr[@]} 的含义为读取数组的所有元素,下面会说到。

语法:arr=( "${copyArr[@]}" )

#!/bin/bash

copyArr=(a b c)

arr=( "${copyArr[@]}" )

echo "${arr[@]}"
7. 读取一个数据到数组中

read -a arr

读取数组

1、读取默认元素

如果没有指定索引值,默认读取索引为0的第一个元素:echo ${arr}

赋值也是同理:

declare -a arr
arr="element"
echo ${arr[0]}

2、读取指定索引的元素

echo ${arr[1]}

3、读取所有元素

@、* 在数组中是两个特殊索引,可以通过这两个字符获取数组的所有元素。

#!/bin/bash

arr=(element1 element2)

echo "${arr[@]}"
echo "${arr[*]}"

输出:

element1 element2
element1 element2

4、通过 for in 迭代数组

既然可以通过@、*获取所有数组元素,那么就可配合 for in 迭代所有的数组元素。

#!/bin/bash

arr=(element1 element2)

for element in "${arr[@]}"
do
    echo "for in: ${element}"
done

数组有效元素的长度

语法:

${#array[*]}
${#array[@]}

如果数组存在空元素,不会被继续长度统计:

declare -a arr=(e1 [5]=e2 e3)

echo ${#arr[@]} # 输出 3

提取有效的数组元素序号

看下面这个栗子的输出:

#!/bin/bash

declare -a arr=(e1 [5]=e2 e3)

for ((i = 0; i < ${#arr[@]}; i++))
do
    echo "index: ${i} -> ${arr[i]}"
    # echo "index: ${i} -> ${arr[${i}]}"
done

输出:

index: 0 -> e1
index: 1 -> 
index: 2 -> 

${#arr[@]}返回的是有效元素的个数,如果数组中没有空元素,那么上面的 for 迭代是没问题的。

但若索引中有空元素,那么会进行空输出。如果我们想要过滤这些空输出,即只迭代有实际值的数组元素该怎么做呢?

可以通过 for in 的方式进行迭代,for in 中会过滤掉空元素。或者也可以像下面这样:

#!/bin/bash

declare -a arr=(e1 [5]=e2 e3)

for vi in "${!arr[@]}"
do
    echo "index: ${vi} -> ${arr[vi]}"
done

输出:

index: 0 -> e1
index: 5 -> e2
index: 6 -> e3

${!arr[@]}会返回有效元素索引的数组。

数组切片

语法:${arr[@]}:position:length,从指定索引处开始提取 length 个元素。若不指定 length 则提取到最后一个元素(arr.length - 1)。

栗子:

#!/bin/bash

declare -a games=("GTA5" "LOL" "CS:GO" "RedAlert2")

echo "${games[@]:0:2}"

echo "${games[@]:2}"

输出:

GTA5 LOL
CS:GO RedAlert2

追加数组元素

可以通过+=运算符进行追加。

$ alp=(a b c)
$ echo ${alp[@]}
a b c

$ alp+=(d e f)
$ echo ${alp[@]}
a b c d e f

删除数组

删除数组:unset 命令

删除数组成员:unset 命令

栗子:

#!/bin/bash

declare -a alp=("a" "b" "c" "d")
echo "${alp[@]}"

unset alp[2]
echo "${alp[@]}"

echo "${#alp[@]}" : "${!alp[@]}"

输出:

a b c d
a b d
3 : 0 1 3

如果通过arr[n]=''arr[n]=的方式删除数组元素是有一些小问题的,将上面栗子中 unset alp[2] 行改为alp[2]=''alp[2]=

a b c d
a b  d
4 : 0 1 2 3

实际上元素并没有真正被删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值