web-dev-qa-db-ja.com

アイテムがbash配列にあるかどうかをテストするにはどうすればよいですか?

簡単なスクリプトのヘルプ

#!/bin/bash

array1=(
prova1
prova2
slack64
)

a="slack64"
b="ab"

if [ $a = $b ]
then
      echo "$a = $b : a is equal to b"
else
      echo "$a = $b: a is not equal to b"
fi

このスクリプトは単に機能しません。slack64がリストに存在するかどうかを確認するスクリプトが必要です(配列を使用します)。配列を単一の変数と比較する方法がわかりません。

15
elbarna

別の種類の配列を使用します。整数インデックス配列ではなく、連想配列を使用して、キー(インデックス)を確認します。 bash-4.0以降が必要です。

declare -A array1=( 
 [prova1]=1  [prova2]=1  [slack64]=1
)

a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"

上記では、値を実際に気にする必要はありません。これを行うには、空である必要はありません。キーと値を交換することにより、インデックス付き配列を新しい連想配列に「反転」できます。

declare -a array1=( 
 prova1 prova2 slack64
)
declare -A map    # required: declare explicit associative array
for key in "${!array1[@]}"; do map[${array1[$key]}]="$key"; done  # see below

a=slack64
[[ -n "${map[$a]}" ]] && printf '%s is in array\n' "$a"

連想配列の実装は配列横断ループよりもパフォーマンスが高いため、頻繁に検索される大きな配列がある場合、これは報われることがあります。ただし、重複を処理できないため(上記のように1だけではなく、カウンターとして値を使用できます)、空のインデックスを処理できないため、すべてのユースケースに適しているわけではありません。

上記の複雑な行を分解して、「反転」を説明します。

for key in "${!a[@]}"     # expand the array indexes to a list of words
do 
  map[${a[$key]}]="$key"  # exchange the value ${a[$key]} with the index $key
done
19
mr.spuratic

簡単な方法はループで繰り返すことです:

var=ab
for item in "${array[@]}"; do
    [[ $var == "$item" ]] && echo "$var present in the array"
done
14
Gilles Quenot

そのためにgrepを使用することもできます。

 array1 =(prova1 prova2 slack64)
 a = slack64 
 if(printf '%s\n' "$ {array1 [@]}" | grep -xq $ a) ;次に
 echo "it's in" 
 fi 
3
Petr Ketner

zshの場合:

array1=(
  prova1
  prova2
  slack64
)

a=slack64

if ((array1[(Ie)$a])); then
  printf '%s\n' "$a in array1"
fi
2

この関数は連想配列で機能します。

この関数を使用して、次のいずれかを実行できます。

-配列に特定のキーがあるかどうかを確認します-----------------> inArray "myKey" $ {!myArray [@]} "

-配列に特定の値が含まれているかどうかを確認します---------> inArray "myValue" "$ {myArray [@]}"

function inArray # ( keyOrValue, arrayKeysOrValues ) 
{
  local e
  for e in "${@:2}"; do 
    [[ "$e" == "$1" ]] && return 0; 
  done
  return 1
}

declare -A arr
arr[doo]=55

inArray "doo" "${!arr[@]}"
echo $?     # 0 
inArray "bla" "${!arr[@]}"
echo $?     # 1 
inArray "55" "${arr[@]}"
echo $?     # 0
2
ling