负长度的Bash数组子集

时间:2019-06-18 08:46:01

标签: arrays bash parameter-expansion

在Bash中,我可以使用${parameter:offset:length}表示法对数组的元素进行切片,但是不能像对字符串进行切片时一样使用所有相同的方式。具体来说,我想使用以下语法来打印除数组的最后n个元素之外的所有元素:

注意:--version的输出是元语法,不是我的问题的意图

calvin@rose:~ A=($(bash --version |head -1)); echo ${A[@]}
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

calvin@rose:~ echo ${A[3]:0:-8}            # Negative length of substring
4.4.12(1)

calvin@rose:~ echo ${A[@]:2:2}             # Predictable behavior with [@]
version 4.4.12(1)-release                  # Desired output

calvin@rose:~ echo ${A[@]:2:-1}            # Desired input
-bash: -1: substring expression < 0        # Limitation of Bash Arrays?

此行为在Parameter Expansion下定义:

  

如果参数为“ @”,则结果是从偏移量开始的长度位置参数。相对于大于最大位置参数的偏移量取负的偏移量,因此对最后一个位置参数求值-1的偏移量。 如果长度计算得出的数字小于零,则是扩展错误。

我当前使用两种解决方法:

calvin@rose:~ unset A[-1]; echo ${A[@]:2}  # This works, but I lose data
version 4.4.12(1)-release

calvin@rose:~ echo ${A[@]:2: ${#A[@]}-3 }  # This works, but it gets messy fast
version 4.4.12(1)-release

有更好的方法吗?蟒蛇A[2:-1]孩子在取笑我。

0 个答案:

没有答案