Testen Sie, ob sich das Element in einem Array in Bash befindet

Testen Sie, ob sich das Element in einem Array in Bash befindet

Gibt es eine gute Möglichkeit, in Bash zu prüfen, ob ein Array ein Element enthält (besser als eine Schleife)?

Gibt es alternativ eine andere Möglichkeit zu prüfen, ob eine Zahl oder Zeichenfolge einer aus einer Reihe vordefinierter Konstanten entspricht?

Antwort1

In Bash 4 können Sie assoziative Arrays verwenden:

# set up array of constants
declare -A array
for constant in foo bar baz
do
    array[$constant]=1
done

# test for existence
test1="bar"
test2="xyzzy"

if [[ ${array[$test1]} ]]; then echo "Exists"; fi    # Exists
if [[ ${array[$test2]} ]]; then echo "Exists"; fi    # doesn't

Um das Array zunächst einzurichten, können Sie auch direkte Zuweisungen vornehmen:

array[foo]=1
array[bar]=1
# etc.

oder so:

array=([foo]=1 [bar]=1 [baz]=1)

Antwort2

Es ist eine alte Frage, aber ich glaube, die einfachste Lösung ist noch nicht aufgetaucht: test ${array[key]+_}Beispiel:

declare -A xs=([a]=1 [b]="")
test ${xs[a]+_} && echo "a is set"
test ${xs[b]+_} && echo "b is set"
test ${xs[c]+_} && echo "c is set"

Ausgaben:

a is set
b is set

Um zu sehen, wie das funktioniert,Das.

Antwort3

Es gibt eine Möglichkeit zu testen, ob ein Element eines assoziativen Arrays vorhanden (nicht festgelegt) ist. Dies ist etwas anderes als „leer“:

isNotSet() {
    if [[ ! ${!1} && ${!1-_} ]]
    then
        return 1
    fi
}

Dann benutze es:

declare -A assoc
KEY="key"
isNotSet assoc[${KEY}]
if [ $? -ne 0 ]
then
  echo "${KEY} is not set."
fi

Antwort4

#!/bin/bash
function in_array {
  ARRAY=$2
  for e in ${ARRAY[*]}
  do
    if [[ "$e" == "$1" ]]
    then
      return 0
    fi
  done
  return 1
}

my_array=(Drupal Wordpress Joomla)
if in_array "Drupal" "${my_array[*]}"
  then
    echo "Found"
  else
    echo "Not found"
fi

verwandte Informationen