Подмножества массивов Bash по отрицательной длине - PullRequest
0 голосов
/ 18 июня 2019

В Bash я могу использовать нотацию ${parameter:offset:length} для нарезки элементов массива, но я не могу использовать ее так же, как и при нарезке строки.В частности, я хотел бы использовать этот синтаксис для печати всех элементов массива, кроме последних n:

note: --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?

Это поведение определено в Расширение параметров :

Если параметр равен '@', результатом являются позиционные параметры длины, начинающиеся со смещения.Отрицательное смещение берется относительно большего, чем наибольший позиционный параметр, поэтому смещение -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] дети смеются надо мной.

...