Pruebe si el elemento está en una matriz en bash

Pruebe si el elemento está en una matriz en bash

¿Existe una buena forma de comprobar si una matriz tiene un elemento en bash (mejor que recorrerla en bucle)?

Alternativamente, ¿hay otra forma de comprobar si un número o cadena es igual a alguno de un conjunto de constantes predefinidas?

Respuesta1

En Bash 4, puedes usar matrices asociativas:

# 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

Para configurar la matriz inicialmente también puedes hacer asignaciones directas:

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

o de esta manera:

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

Respuesta2

Es una vieja pregunta, pero creo que aún no ha aparecido cuál es la solución más sencilla: test ${array[key]+_}. Ejemplo:

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"

Salidas:

a is set
b is set

Para ver cómo funciona esto, consulteeste.

Respuesta3

Hay una manera de probar si un elemento de una matriz asociativa existe (no establecido), esto es diferente de estar vacío:

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

Entonces úsalo:

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

Respuesta4

#!/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

información relacionada