첫 번째 인덱스와 마지막 인덱스 사이의 모든 요소를 ​​가져오기 위해 인덱스 배열을 분할하는 방법은 무엇입니까?

첫 번째 인덱스와 마지막 인덱스 사이의 모든 요소를 ​​가져오기 위해 인덱스 배열을 분할하는 방법은 무엇입니까?

tokens포함된 값이 있습니다 tokens=( first one two three last ). ( one two three )배열에 몇 개의 숫자가 있는지 모르는 경우 어떻게 값을 얻을 수 있나요? firstlast(독점) 사이의 모든 항목 에 액세스하고 싶습니다 .

echo ${tokens[*]:1:3}

줄 것입니다 one two three. 그러나 배열의 길이를 모르는 경우 first전후의 모든 요소를 ​​어떻게 얻을 수 있습니까 last? Python에서 음수 인덱스를 사용하는 것과 비슷한 것을 찾고 있습니다.tokens[1:-1]

답변1

배열이 희소하지 않은 경우 다음을 수행할 수 있습니다.

bash-5.2$ tokens=( {1..10} )
bash-5.2$ printf ' - %s\n' "${tokens[@]:1:${#tokens[@]}-2}"
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9

배열이 희소할 가능성이 있는 경우 두 번째 요소의 인덱스를 결정해야 합니다(여기서는 요소가 2개 이상 있다고 가정).

bash-5.2$ tokens=([12]=a [15]=b [23]=c [123]=d)
bash-5.2$ ind=( "${!tokens[@]}" )
bash-5.2$ printf ' - %s\n' "${tokens[@]:ind[1]:${#tokens[@]}-2}"
 - b
 - c

zsh(희소 배열이 아닌 일반 배열이 있음) 에는 $tokens[2,-2].

답변2

Bash 버전에 따라 다음이 작동합니다.

tokens=( first one two three last )
echo "${tokens[@]:1:${#tokens[@]}-2}"

결과

one two three

관련 정보