В 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]
дети смеются надо мной.