当前位置:网站首页>Shell系统学习之数组
Shell系统学习之数组
2022-07-30 09:04:00 【edenliuJ】
目录
如何定义数组
通过指定元素值来定义数组
语法如下:
array[key]=valuearray为数组名,key为元素索引,一般为整数(要求key>=0),value为对应元素的值,后面我们再讲key为字符串的情况。
下面看个简单的示例
#!/bin/bash
array[1]=one
array[3]=3
#数组所有元素的值
echo ${array[@]}
#数组长度
echo ${#array[@]}结果如下:
[email protected]:~/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[@]}"结果如下:
[email protected]:~/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[@]}"结果如下:
[email protected]:~/Documents/Shell/7$ ./7-3.sh
four
one four
2
key为字符串的数组
前面说了key可以为整数,也可以为字符串。为字符串时,我们成此数组为关联数组。
关联数组只有bash 4.0以上版本才支持,如何查看bash版本?
在Shell控制台按ctrl+x,然后ctrl+v,bash的版本信息就会显示在控制台上。
关联数组的定义和上面一样,只是key换为字符串。由一点区别是,需要使用declare命令定义,然后才能开始赋值。
declare -A array_namearray_name就是数组名。
数组和普通变量的关系
可以这么理解,Shell中的所有变量都是数组类型,普通变量是一个长度为1,下标为0的数组。
请看示例:
#!/bin/bash
array="hello world!"
echo "${array}"
echo "${array[0]}"
echo "${array[@]}"
echo "${#array[@]}"结果如下:
[email protected]:~/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[@]}结果如下:
[email protected]:~/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]}"结果为:
[email protected]:~/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}"结果如下:
[email protected]:~/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}"
结果如下:
[email protected]:~/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[@]}"
结果如下:
[email protected]:~/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[@]}"结果如下:
[email protected]:~/Documents/Shell/7$ ./7-10.sh
1 2 3 4 one two three four bash csh
10
加载文件内容到数组变量
用户可以将普通文件的文本文件的内容直接加载到数组中,文件中每一行构成数组一个元素的内容。
首先准备一个文件,该文件比较简单,比如:
[email protected]:~/Documents/Shell/7$ cat demo.txt
123
456
789
使用cat命令,将文件内容加载到数组变量中,请看下面示例:
#!/bin/bash
content=(`cat demo.txt`)
echo "${content[@]}"
echo "${#content[@]}"结果如下:
[email protected]:~/Documents/Shell/7$ ./7-11.sh
123 456 789
3
小结
本篇文章主要介绍Shell中数组的定义,赋值,访问,切片访问,删除以及其他的一些操作比如,拷贝,连接,加载文件内容到数组等。
边栏推荐
- 瑞吉外卖项目(五) 菜品管理业务开发
- qsort 函数的使用及其模拟实现
- Concise Notes on Integrals - Types of Curve Integrals of the Second Kind
- STM8L_库函数-模板搭建
- 研发人员的悲剧——“庞氏骗局”
- 一个低级错误导致的诡异现象——走近科学能拍三集,(C语言)最简单的数组元素读取,不正确!?
- The R installation package has error in rawtochar(block[seq_len(ns)]) :
- leetcode 剑指 Offer 22. 链表中倒数第k个节点
- 【 HMS core 】 【 】 the FAQ HMS Toolkit collection of typical questions 1
- 使用 Neuron 接入 Modbus TCP 及 Modbus RTU 协议设备
猜你喜欢

Circuit analysis: constant current source circuit composed of op amp and triode

包、类及四大权限和static

HCIP - MPLS VPN experiment

The difference between DDR, GDDR, QDR

详解JVM垃圾回收

C#中Config文件中,密码的 特殊符号的书写方法。
![MySQL [operator]](/img/dd/2bf6ccd731299dc405bc06e03e1550.png)
MySQL [operator]

快解析结合用友时空

An article to understand service governance in distributed development

HashSet and LinkedHashSet
随机推荐
How to implement Golang DES encryption and decryption?
Jetpack Compose 从入门到入门(八)
MySQL Explain usage and parameter detailed explanation
2022/07/29 学习笔记 (day19)异常处理
函数式接口&Lambda表达式——简单应用笔记
MySQL【运算符】
PyTorch安装及环境配置(Win10)
Integral Topic Notes - Path Independent Conditions
leetcode 剑指 Offer 63. 股票的最大利润
echart图表清空上一次数据
How to Assemble a Registry
It is said that FPGA is high-end, what can it do?
编程界的“躲猫猫”比赛 | 每日趣闻
els 方块向左移动
CSDN21天学习挑战赛
团队级敏捷真的没你想的那么简单
leetcode 剑指 Offer 48. 最长不含重复字符的子字符串
els 方块停在方块上。
Version management of public Jar packages
20220728使用电脑上的蓝牙和汇承科技的蓝牙模块HC-05配对蓝牙串口传输