我有一个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