我正在尝试删除数组元素的范围,但失败了..
我的数组
root@ubuntu:~/work# echo ${a[@]}
cocacola.com airtel.com pepsi.com
Run Code Online (Sandbox Code Playgroud)
打印 0-1 数组看起来没问题
root@ubuntu:~/work# echo ${a[@]::2}
cocacola.com airtel.com
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用以下方法仅删除这些元素:
root@ubuntu:~/work# unset a[@]::2
root@ubuntu:~/work# echo ${a[@]}
Run Code Online (Sandbox Code Playgroud)
这是删除整个数组..
我做错了什么?
我找到了其他删除数组范围的方法,但为什么上面的东西不起作用?
for ((i=0; i<2; i++)); do unset a[$i]; done
Run Code Online (Sandbox Code Playgroud)
编辑我也试过但没有运气
unset -v 'a[@]::2'
Run Code Online (Sandbox Code Playgroud)
Sté*_*las 14
要记住的一件事是bash
实现的数组,如ksh
,即作为关联数组,其中键仅限于正整数(与其他语言相反,例如perl
或zsh
例如)。
在:
a[123]=foo a[456]=bar a[789]=baz
Run Code Online (Sandbox Code Playgroud)
在 bash 中,您有一个包含 3 个元素的关联数组,而在 bash 中perl
,您将有一个包含 790 个元素(zsh 为 789 个)的数组。
在ksh
or 中bash
,${a[@]:0:1}
返回按键数字排序的元素列表中数组的第一个元素,其中键大于或等于 0。因此在这种情况下,它返回${a[123]}
,而不是${a[0]}
。
unset 'a[123]'
Run Code Online (Sandbox Code Playgroud)
(记住引用它,否则如果当前目录中有一个名为 a1 或 a2 或 a3 的文件会失败)是有道理的,因为它删除了数组中的特定键。
unset 'a[@]::2'
Run Code Online (Sandbox Code Playgroud)
虽然意义不大。bash
只有理解unset a
,unset 'a[123]'
或者unset 'a[*/@]'
,什么后忽略,所以unset 'a[@]::2'
并unset 'a[@]please'
做同样的:整个阵列未设置。
如果要取消设置一系列键,则需要遍历键:
要获取数组的键列表,语法是"${!a[@]}"
. 不幸的是,应用范围不适用于bash
nor ksh
,因此您需要一个临时数组:
keys=("${!a[@]}")
for i in "${keys[@]::2}"; do unset "a[$i]"; done
Run Code Online (Sandbox Code Playgroud)
现在,如果你想像其他语言一样考虑这些数组,你不想使用unset
. 就像,如果数组首先不是稀疏的,并且您想保持它(即将所有元素移动 2 而不是取消设置前两个),您可以执行以下操作:
a=("${a[@]:2}")
Run Code Online (Sandbox Code Playgroud)
那就是用要保留的元素列表重新分配数组。
为了比较,与zsh
.
a=({1..20})
unset 'a[12,16]'
Run Code Online (Sandbox Code Playgroud)
将为元素 12 到 16 设置一个空值。同时unset 'a[16,20]'
将数组缩小到 15 个元素。
a=({1..20})
a[12,16]=()
Run Code Online (Sandbox Code Playgroud)
(仍然与zsh
) 会将元素 17 到 20 移动 5 个位置,因此a[12]
将包含17
.
归档时间: |
|
查看次数: |
23779 次 |
最近记录: |