我想删除数组中的最后一个元素,并且当我使用 ${#array[@]}
时,希望该数组显示它已经少了1个元素。这是我目前正在使用的代码行:
unset GreppedURLs[${#GreppedURLs[@]} -1]
请纠正我并向我展示正确的方法。
unset 'arr[${#arr[@]}-1]'
unset arr[-1]
(注意单引号:它们可以防止路径名扩展)。arr=( a b c )
echo ${#arr[@]}
3
for a in "${arr[@]}"; do echo "$a"; done
a b c
unset 'arr[${#arr[@]}-1]'
for a in "${arr[@]}"; do echo "$a"; done
a b
妙语
echo ${#arr[@]}
2
(GNU bash,版本4.2.8(1)-release (x86_64-pc-linux-gnu))
¹ @Wil 提供了一个出色的答案,适用于各种类型的数组
在-1
之前必须去掉空格。
如果您想得到一个不会吃掉您小猫的答案,请尝试以下方法:
array=([1]=1 {2..5} [10]=6);
# declare -a array='([1]="1" [2]="2" [3]="3" [4]="4" [5]="5" [10]="6}")'
index=("${!array[@]}");
# declare -a index='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="10")'
unset 'array[${index[@]: -1}]';
# declare -a array='([1]="1" [2]="2" [3]="3" [4]="4" [5]="5")'
接下来,我将介绍一个更简单的答案,可以满足您的需求,但有一个警告:
array=([1]=1 {2..5} [10]=6);
# declare -a array='([1]="1" [2]="2" [3]="3" [4]="4" [5]="5" [10]="6}")'
array=("${array[@]::${#array[@]}-1}");
# declare -a array='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")'
这个版本采取了一种捷径。它重新索引了数组并删除了最后一个元素。不幸的是,您还可以看到索引没有被维护。值及其顺序已被维护。如果您不关心索引,则这可能是您想要的答案。
上述两个答案也适用于bash 4关联数组。
--
所选答案不安全。以下是一个例子:array=([1]=1 {2..5} [10]=6);
# declare -a array='([1]="1" [2]="2" [3]="3" [4]="4" [5]="5" [10]="6")'
unset 'arr[${#arr[@]}-1]';
# declare -a array='([1]="1" [2]="2" [3]="3" [4]="4" [10]="6")'
unset 'arr[-1]'
。顺便说一下,你的答案也是错误的:在你的unset
语句中缺少引号,因此你的命令会受到路径名扩展的影响。 - gniourf_gniourfindex
?你声称你的方法不会吃掉我的小猫,但是它确实这样做了。 declare -A array=( [\*]=you_killed_my_kittens [cat]=i_love_kittens ); index=(${!array[@]}); unset 'array[${index[@]: -1}]'; declare -p array
. 噢~~~~ - gniourf_gniourf对于任何索引数组(无论稀疏还是不稀疏),自bash 4.3+(和ksh93+)以来,这是最简单的解决方案:
unset 'array[-1]'
如果-1是算术表达式或变量,则需要引号来避免在bash中进行shell扩展。下面这种写法也是正确的:
a=3; unset 'arr[ a - 4 * 1 ]'
如果未加引号(''
),则无法正常工作,因为星号将会扩展为当前工作目录中的文件列表($pwd
)。针对IT技术相关内容,以下是适用于旧版bash的解决方案:这适用于非稀疏数组,自bash 3.0版本起可使用:
unset 'arr[ ${#arr[@]}-1 ]'
例子:
$ arr=( {a..i} ); declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f" [6]="g" [7]="h")
$ unset 'arr[ ${#arr[@]}-1 ]'; declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f" [6]="g")
这种方法不适用于稀疏数组(带有一些空洞):
$ arr=( {a..g} [9]=i ); declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f" [6]="g" [9]="i")
$ unset 'arr[ ${#arr[@]}-1 ]'; declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f" [6]="g" [9]="i")
${#arr[@]}
)是8
,而8-1
是7
。arr[7]
。什么也没做。arr
已经被定义(适用于bash 3.0+):$ index=( "${!arr[@]}" ) # makes index non-sparse.
$ unset 'arr[${index[@]}-1]' # unset the last index.
$ declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e" [5]="f" [6]="g")
$ arr=( {a..e} [9]=i )
$ index=( "${!arr[@]}" )
$ unset "arr[ ${index[${#index[@]}-1]} ]" # Yes, double quotes.
$ declare -p arr
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d" [4]="e")
$ unset "arr[${index[@]: -1}]"
$ a="-1"; unset "arr[${index[@]:a}]"
unset 'array[-1]'
的简洁性,但不幸的是它在我的操作系统中最新版本的bash v4中不是一个有效的命令。不过我会记住它以备将来之需。 - Cameron Hudsonunset 'array [ $ {index [@]}-1]'
,自从bash 3.0以后(在此答案中列出)。 - user8017719unset arr[$[${#arr[@]}-1]] # non-sparse array only
len=${#arr[@]}
idx=$[$len-1] # <=> $(($len-1))
unset arr[$idx]
$[ ]
语法已经过时。 - Sapphire_Bricktarget="${@:$(($#)):1}"
set -- "${@:1:$(($#-1))}"
arr[${#arr[@]}-1]
来破坏代码的可读性。Bash 数组可以被视为“循环”结构,也就是说,第 -1 个元素和最后一个元素是相同的。因此,可以使用unset arr[-1]
。 - Géza Török