在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]
孩子在取笑我。