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をスキップ)。

関連情報