
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