我正在打电话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)。