1

在 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 采用负偏移量,因此 -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]孩子们在取笑我。

4

0 回答 0