![如何对索引数组进行切片以获得第一个索引和最后一个索引之间的所有元素?](https://linux22.com/image/211947/%E5%A6%82%E4%BD%95%E5%AF%B9%E7%B4%A2%E5%BC%95%E6%95%B0%E7%BB%84%E8%BF%9B%E8%A1%8C%E5%88%87%E7%89%87%E4%BB%A5%E8%8E%B7%E5%BE%97%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%B4%A2%E5%BC%95%E5%92%8C%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E7%B4%A2%E5%BC%95%E4%B9%8B%E9%97%B4%E7%9A%84%E6%89%80%E6%9C%89%E5%85%83%E7%B4%A0%EF%BC%9F.png)
我有一个tokens
包含tokens=( first one two three last )
.( one two three )
如果我不知道数组中有多少个数字,如何获取值?我想访问first
和last
(不包括)之间的所有内容。
echo ${tokens[*]:1:3}
会给出one two three
,但如果我不知道数组的长度,我怎样才能获得之后first
和之前的所有元素last
?我正在寻找类似于在Python中使用负索引的东西,例如tokens[1:-1]
答案1
如果数组不是稀疏的,你可以这样做:
bash-5.2$ tokens=( {1..10} )
bash-5.2$ printf ' - %s\n' "${tokens[@]:1:${#tokens[@]}-2}"
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如果数组可能稀疏,您需要确定第二个元素的索引(这里假设它至少有 2 个元素):
bash-5.2$ tokens=([12]=a [15]=b [23]=c [123]=d)
bash-5.2$ ind=( "${!tokens[@]}" )
bash-5.2$ printf ' - %s\n' "${tokens[@]:ind[1]:${#tokens[@]}-2}"
- b
- c
在zsh
(有普通数组,而不是稀疏数组)中,它只是$tokens[2,-2]
.
答案2
根据您的 Bash 版本,以下内容应该有效:
tokens=( first one two three last )
echo "${tokens[@]:1:${#tokens[@]}-2}"
结果
one two three