向Shell数组添加元素有多种方法,每种方法在使用时都有一些需要注意的地方,没有见过这方面的总结资料,所以自己总结一下。
直接下标添加
array_name[index]=value
最简单的添加方式,直接用下标index为数组元素赋值,在使用时需要注意的是就是需要确保下标index处原本是没有值的,否则会替换index处原本的值。
数组长度添加
array_name[${#array_name[@]}]=value #或array_name[${#array_name[*]}]=value
以数组长度为下标添加,每次只能增加一个元素。但此方法有一个前提,就是数组中的元素下标必须是连续的,否则会存在替换已有元素的风险。例如:
arr=([1]="a" [2]="b") echo ${arr[@]} arr[${#arr[@]}]="c" echo ${arr[@]}
实际上并有添加元素,而是将下标为2的元素值“b”替换为了“c”。
重新创建数组
array_name=("${array_name[@]}" value1 ... valueN)
这种方式不需要下标连续,可同时添加多个元素,但是有一些要注意的地方:
首先,使用此方式添加元素后,数组中原有元素的下标会重置,会从0开始变成连续的,如果不希望改变下标则不能使用这种方式。
其次,双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。
最后,不能将“@”替换为“*”,虽然在输出数组元素时可以相互替换,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中。类似于特殊变量$@和$*的区别。
#!/bin/bash arr1=() initArray(){ arr1=([2]="a b" [3]=2 [5]=4) } showArray(){ echo "Elements in arr1: ${arr1[@]}" echo "Length of arr1: ${#arr1[@]}" echo "The 3rd elements is: ${arr1[2]}" echo } initArray echo "original arr1:" showArray echo "add new elements 3 and 5" echo "--------------------" echo "use @ without quote" arr1=(${arr1[@]} 3 5) showArray initArray echo "use * without quote" arr1=(${arr1[*]} 3 5) showArray initArray echo "use @ with quote" arr1=("${arr1[@]}" 3 5) showArray initArray echo "use * with quote" arr1=("${arr1[*]}" 3 5) showArray
运行结果为:
original arr1:
Elements in arr1: a b 2 4
Length of arr1: 3
The 3rd elements is: a b
add new elements 3 and 5
--------------------
use @ without quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 6
The 3rd elements is: 2
use * without quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 6
The 3rd elements is: 2
use @ with quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 5
The 3rd elements is: 4
use * with quote
Elements in arr1: a b 2 4 3 5
Length of arr1: 3
The 3rd elements is: 5
赋值运算符+=
array_name+=(value1 ... valueN)
这种方式不需要元素下标连续,可以添加多个元素,添加后元素下标不会重置,不存在元素覆盖的风险。唯一要注意的就是“+=”前后不能有空格,并且后面的待添加元素必须用“()”包围起来,并且多个元素用空格分隔。新添加的元素的下标取决于原本数组中最后有值的元素的下标。
#!/bin/bash arr1=() initArray(){ arr1=([2]="a b" [3]=2 [5]=4) } showArray(){ echo "Elements in arr1: ${arr1[@]}" echo "Length of arr1: ${#arr1[@]}" echo "The 3rd elements is: ${arr1[2]}" echo } initArray echo "original arr1:" showArray echo "add new elements 3 and 5" echo "--------------------" echo "use += " arr1+=(3 5) showArray echo "The 8th elements is: ${arr1[7]}"
运行结果为:
original arr1:
Elements in arr1: a b 2 4
Length of arr1: 3
The 3rd elements is: a b
add new elements 3 and 5
--------------------
use +=
Elements in arr1: a b 2 4 3 5
Length of arr1: 5
The 3rd elements is: a b
The 8th elements is: 5
数组中原本的元素没有改变,新添加的元素下标是在最后有值的元素下标5的基础上递增的。
总结
添加方式 语法
可添加多个元素
下标必须连续 添加后下标改变 可能覆盖原有元素 直接下标添加 array_name[index]=value 否 否 否 是 数组长度添加array_name[${#array_name[@]}]=value
或array_name[${#array_name[*]}]=value
否 是 否 是 重新创建数组 array_name=("${array_name[@]}" value1 ... valueN) 是 否 是 否 赋值运算符+= array_name+=(value1 ... valueN) 是 是 是 否免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]