目录
语法如下:
array[key]=value
array为数组名,key为元素索引,一般为整数(要求key>=0),value为对应元素的值,后面我们再讲key为字符串的情况。
下面看个简单的示例
- #!/bin/bash
- array[1]=one
- array[3]=3
-
- #数组所有元素的值
- echo ${array[@]}
- #数组长度
- echo ${#array[@]}
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-1.sh
one 3
2
Shell的数组下标也是从0开始的,但是可以看出key不一定要连续。
定义时,一次性为数组所有元素提供一个值,语法为:
array=(v0 v1 v2 ...)
Shell会将这些值从下标0的元素开始,依次将这些值赋值给所有元素,看示例:
- #!/bin/bash
- array=(1 2 3 4 5)
- #数组下标为0的元素值
- echo "${array[0]}"
- #数组所有元素的值
- echo "${array[@]}"
- #数组长度
- echo "${#array[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-2.sh
1
1 2 3 4 5
5
语法如下:
array=([0]=v0 [1]=v1 [2]=v2 ...)
[]符号里是key,=号右边是对应的value,这里key不要求连续,看示例
- #!/bin/bash
- array=([1]=one [4]=four)
- echo "${array[4]}"
- echo "${array[@]}"
- echo "${#array[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-3.sh
four
one four
2
前面说了key可以为整数,也可以为字符串。为字符串时,我们成此数组为关联数组。
关联数组只有bash 4.0以上版本才支持,如何查看bash版本?
在Shell控制台按ctrl+x,然后ctrl+v,bash的版本信息就会显示在控制台上。
关联数组的定义和上面一样,只是key换为字符串。由一点区别是,需要使用declare命令定义,然后才能开始赋值。
declare -A array_name
array_name就是数组名。
可以这么理解,Shell中的所有变量都是数组类型,普通变量是一个长度为1,下标为0的数组。
请看示例:
- #!/bin/bash
- array="hello world!"
- echo "${array}"
- echo "${array[0]}"
- echo "${array[@]}"
- echo "${#array[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-4.sh
hello world!
hello world!
hello world!
1
array[n]=value
通过指定下标进行赋值。
array=(v0 v1 v2 ...)
与前面定义一样,这种方式会将整个数组重新赋值,包括长度和值。举个例子:
- #!/bin/bash
- array=(a b "c d" e)
- echo ${array[@]}
- echo ${#array[@]}
-
- array=(1 2 3)
- echo ${array[@]}
- echo ${#array[@]}
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-5.sh
a b c d e
4
1 2 3
3
与单个项赋值一样,如果该项key不存在,使用
array[n]=value
赋值方法就会新增这一项。
访问第一个数组可以直接用${array_name}的方式,就像前面数组和普通变量的关系说明的一样。
array[n]
这个就是按照key来访问:前面示例已经由使用这种方式
前面的示例也已经展示
${#array_name[@]}
或者${#array_name[*]},获取数组长度。
还可以获取数组中某项值的长度
${#array_name[n]}
n表示下标。请看示例:
- #!/bin/bash
- array=("ubuntu" "Debian" "Suse")
- echo "${array[0]}"
- #ubuntu字符串长度
- echo "${#array[0]}"
结果为:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-6.sh
ubuntu
6
前面示例也已经展示,命令为:
${array_name[@]}
或者 ${array_name[*]}
这个在之前的文章由讲过,请查看
Shell系统学习之循环结构_edenliuJ的博客-CSDN博客
与python中的切片方式类似:
${array_name[@]:start:lenght}
将@换成*是一样的。
start表示起始下标,lenght表示从起始下标开始截取的数组元素的个数。
- #!/bin/bash
- array=("ubuntu" "Debian" "Suse")
- echo "${array[@]}"
- #从下标1开始截取2个元素
- echo "${array[@]:1:2}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-7.sh
ubuntu Debian Suse
Debian Suse
我们也可以截取某一项数组元素,语法如下:
${array_name[n]:start:lenght}
请看示例:
- #!/bin/bash
- array=("ubuntu" "Debian" "Suse")
- echo "${array[0]}"
- #截取ubuntu
- echo "${array[0]:2:4}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-8.sh
ubuntu
untu
如果lenght超过了数组或者数组元素的大小,都只会截取到数组或者数组元素的末尾。
对数组元素的部分内容用其他字符串来替换,但是并不影响原数组的值,数值元素替换命令如下:
${array_name[@]/pattern/replacement}
pattern表示要搜索的字符串,replacement表示用来替换的字符串。注意这个是可以部分替换的,不是说一定要元素值完全等于pattern才能替换,只要元素值中包含了pattern的内容,就会被替换掉。下面请看示例
- #!/bin/bash
- array=(1 2 44 55 123)
- echo "${array[@]/1/3}"
- #不会改变原数组的值
- echo "${array[@]}"
- a=("${array[@]/1/3}")
- echo "${a[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-9.sh
3 2 44 55 323
1 2 44 55 123
3 2 44 55 323
使用unset命令可以删除数组中的一项或者整个数组
删除一项:
unset array_name[n]
删除整个数组
unset array_name
前面示例已经有展示,命令如下:
new_array_name=("${array_name[@]}")
连接数组是将多个数组连接在一起,组合成一个数组。新的数组依次包含连接进来数组的元素。语法如下:
("$array1[@]" "$array2[@]" ...)
请看示例:
- #!/bin/bash
- a1=(1 2 3 4)
- a2=(one two three four)
- a3=("bash" "csh")
-
- a4=("${a1[@]}" "${a2[@]}" "${a3[@]}")
- echo "${a4[@]}"
- echo "${#a4[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-10.sh
1 2 3 4 one two three four bash csh
10
用户可以将普通文件的文本文件的内容直接加载到数组中,文件中每一行构成数组一个元素的内容。
首先准备一个文件,该文件比较简单,比如:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ cat demo.txt
123
456
789
使用cat命令,将文件内容加载到数组变量中,请看下面示例:
- #!/bin/bash
- content=(`cat demo.txt`)
- echo "${content[@]}"
- echo "${#content[@]}"
结果如下:
eden_ubuntu@edenubuntu:~/Documents/Shell/7$ ./7-11.sh
123 456 789
3
本篇文章主要介绍Shell中数组的定义,赋值,访问,切片访问,删除以及其他的一些操作比如,拷贝,连接,加载文件内容到数组等。