Sie können feststellen, ob ein Eintrag vorhanden ist, indem Sie den Inhalt des Arrays an grep weiterleiten.
printf "%s\n" "$" | grep "^$$"
Sie können auch den Index eines Eintrags mit grep -n abrufen, der die Zeilennummer einer Übereinstimmung zurückgibt (denken Sie daran, 1 zu subtrahieren, um einen nullbasierten Index zu erhalten). Dies wird mit Ausnahme von sehr großen Arrays recht schnell sein.
# given the following data mydata=(a b c "hello world") for val in a c hello "hello world" do # get line # of 1st matching entry ix=$( printf "%s\n" "$" | grep -n -m 1 "^$$" | cut -d ":" -f1 ) if [[ -z $ix ]] then echo $val missing else # subtract 1. Bash arrays are zero-based, but grep -n returns 1 for 1st line, not 0 echo $val found at $(( ix-1 )) fi done a found at 0 c found at 2 hello missing hello world found at 3
Erläuterung:
$( ... )
ist dasselbe wie das Verwenden von Backticks, um die Ausgabe eines Befehls in einer Variablen zu erfassen printf
gibt meine Daten ein Element pro Zeile aus - (alle Anführungszeichen zusammen mit
@
stattdessen *.
vermeiden die Aufteilung der "Hallo Welt" in 2 Zeilen) grep
sucht nach exakter Zeichenfolge: ^
und $
stimmt mit dem Anfang und dem Zeilenende überein grep -n
gibt Zeile # in Form von 4: Hallo Welt zurück grep -m 1
findet nur die erste Übereinstimmung cut
extrahiert nur die Zeilennummer - subtrahieren Sie 1 von der zurückgegebenen Zeilennummer.
Sie können die Subtraktion natürlich in den Befehl einklappen. Aber dann auf -1 für fehlendes testen:
ix=$(( $( printf "%s\n" "$" | grep -n -m 1 "^$$" | cut -d ":" -f1 ) - 1 )) if [[ $ix == -1 ]]; then echo missing; else ... fi
$(( ... ))
macht ganzzahlige Arithmetik