从 bash 数组中删除最后一个元素

从 bash 数组中删除最后一个元素

我正在打电话find通过构造一个包含文件名后缀的数组来调用isufx

因此,我有

echo "isufx: ${isufx[*]}"

这导致

-name *.texi -o -name *.org -o

最后,我删除了数组中的最后一个元素(-o),这样我就可以将它与find.

find "$fdir" "${isufx[@]}" 

我询问在数组索引不从 0 开始的情况下,使用什么技术来删除最后一个更可靠的元素。

答案1

使用最新版本bash(4.3 或更高版本),您可以执行以下操作:

unset 'array[-1]'

取消设置具有最高索引的元素,例如zsh

$ bash -c 'a[3]=1 a[12]=2; a[123123]=3; typeset -p a; unset "a[-1]"; typeset -p a'
declare -a a=([3]="1" [12]="2" [123123]="3")
declare -a a=([3]="1" [12]="2")

自 ksh93t 以来,这也适用于 ksh93。

请注意,引号是必需的,就像[...]Bourne 式 shell 中的 glob 运算符一样。array1例如,如果当前目录中有一个文件被调用,则不带引号的文件array[-1]将扩展为array1,如果没有,则要么扩展为空,要么扩展为array[-1]根据 shell 和 glob 选项设置,要么扩展为空,要么扩展为或导致错误。

zsh(其中数组是普通数组,而不是 ksh/bash 的稀疏数组)中,除了 之外unset 'array[-1]',您还可以执行以下操作:

array[-1]=()

(与取消设置任何元素并移动其后面的元素相同,而unset当它不是最后一个元素时将元素设置为空字符串,以保持与 ksh 的某种程度的兼容性)。

yash(也适用于普通数组):

array -d array -1

fish(也适用于普通数组):

set -e array[-1]

csh(也适用于普通数组,以及第一个支持数组的 shell(自 70 年代末以来!)):

set array[$#array] =

答案2

您可以使用数组切片来获取除最后一个元素之外的所有元素:

find "$fdir" "${isufx[@]:0:${#isufx[@]}-1}"

解释:${#isufx[@]}获取数组中的元素数量,添加到:0:numelements-1数组扩展中会得到从 #0 开始的 numelements-1 个元素...,除了最后一个之外的所有元素。

您还可以通过稍微不同地构造数组来简化它:将额外的内容放在-o开头(即对于每个后缀,添加"-o" "-name" "*.$suffix"而不是"-name" "*.$suffix" "-o"),然后使用"${isufx[@]:1}"从元素 #1 开始(跳过 #0)。

相关内容