Bash 배열에서 마지막 요소 제거

Bash 배열에서 마지막 요소 제거

find파일 이름 접미사를 포함하는 배열을 구성하여 호출 하고 있습니다 isufx.

그러므로 나는

echo "isufx: ${isufx[*]}"

이로 인해

-name *.texi -o -name *.org -o

마지막으로 배열의 마지막 요소(-o)를 제거하여 find.

find "$fdir" "${isufx[@]}" 

배열 인덱스가 0에서 시작하지 않는 경우 더 안정적인 마지막 요소를 제거하는 데 어떤 기술이 사용되는지 묻습니다.

답변1

최신 버전 bash(4.3 이상)을 사용하면 다음을 수행할 수 있습니다.

unset 'array[-1]'

예를 들어, 가장 높은 인덱스를 가진 요소를 설정 해제합니다 zsh.

$ bash -c 'a[3]=1 a[12]=2; a[123123]=3; typeset -p a; unset "a[-1]"; typeset -p a'
declare -a a=([3]="1" [12]="2" [123123]="3")
declare -a a=([3]="1" [12]="2")

ksh93t부터 이는 ksh93에도 적용됩니다.

[...]Bourne 스타일 쉘의 glob 연산자와 마찬가지로 따옴표가 필요합니다 . array1예를 들어, 현재 디렉터리에 호출된 파일이 있으면 인용되지 않은 파일은 array[-1]으로 확장되고 array1, 그렇지 않으면 null로 확장되거나 array[-1]쉘 및 glob 옵션 설정에 따라 오류가 발생합니다.

(배열이 ksh/bash의 희소 배열이 아닌 일반 배열인 경우 ) 다음을 zsh제외하고 unset 'array[-1]'다음을 수행할 수 있습니다 .

array[-1]=()

(ksh와의 호환성을 어느 정도 유지하기 위해 요소를 설정 해제하고 그 뒤에 요소를 이동하는 것과 동일하며, unset마지막 요소가 아닌 경우 빈 문자열로 요소를 설정합니다.)

In yash(일반 배열에서도 작동):

array -d array -1

In fish(일반 배열에서도 작동):

set -e array[-1]

in csh(일반 배열에서도 작동하며 배열을 지원하는 최초의 셸(70년대 후반 이후!)):

set array[$#array] =

답변2

배열 슬라이싱을 사용하여 마지막 요소를 제외한 모든 요소를 ​​가져올 수 있습니다.

find "$fdir" "${isufx[@]:0:${#isufx[@]}-1}"

설명: ${#isufx[@]}배열의 요소 수를 가져옵니다. :0:numelements-1배열 확장에 추가하면 #0...부터 시작하여 마지막 요소를 제외한 모든 요소를 ​​numelements-1개로 가져옵니다.

배열을 약간 다르게 구성하여 단순화할 수도 있습니다. 추가 항목을 -o시작 부분에 배치하고(예: 각 접미사에 대해 대신 추가 "-o" "-name" "*.$suffix") "-name" "*.$suffix" "-o"요소 "${isufx[@]:1}"#1부터 시작합니다(#0 건너뛰기).

관련 정보