it-swarm.com.de

Wie finde ich einen Teilstring innerhalb eines Strings (oder wie man eine Variable grep) kann?

Ich verwende BASH und weiß nicht, wie ich einen Teilstring finden kann. Es versagt immer wieder, ich habe einen String (sollte dies ein Array sein?)

Nachfolgend ist LIST eine Liste von Datenbanknamen, SOURCE ist die Antwort, eine dieser Datenbanken. Folgendes funktioniert immer noch nicht:

echo "******************************************************************"
echo "*                  DB2 Offline Backup Script                     *"
echo "******************************************************************"
echo "What's the name of of the  database you would like to backup?"
echo "It will be named one in this list:"
echo ""
LIST=`db2 list database directory | grep "Database alias" | awk '{print $4}'`
echo $LIST
echo ""
echo "******************************************************************"
echo -n ">>> "
read -e SOURCE

if expr match "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi
exit -1

Ich habe es auch ausprobiert, funktioniert aber nicht:

if [ `expr match "$LIST" '$SOURCE'` ]; then
25
edumike
LIST="some string with a substring you want to match"
SOURCE="substring"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi
47
dietbuddha

Sie können auch mit Platzhaltern vergleichen:

if [[ "$LIST" == *"$SOURCE"* ]]

27
sreimer

Wenn Sie bash verwenden, können Sie es einfach sagen

if grep -q "$SOURCE" <<< "$LIST" ; then
    ...
fi
6
Sorpigal

Dies funktioniert in Bash, ohne externe Befehle zu verzerren:

function has_substring() {
   [[ "$1" != "${2/$1/}" ]]
}

Verwendungsbeispiel:

name="hello/world"
if has_substring "$name" "/"
then
   echo "Indeed, $name contains a slash!"
fi
5
Hisham H M
expr match "$LIST" '$SOURCE'

funktioniert nicht, weil diese Funktion $ SOURCE vom Anfang des Strings aus sucht und die Position unmittelbar nach dem Muster $ SOURCE zurückgibt, wenn sonst 0 gefunden wird. Sie müssen also einen anderen Code schreiben:

expr match "$LIST" '.*'"$SOURCE" or expr "$LIST" : '.*'"$SOURCE"

Der Ausdruck $ SOURCE muss in Anführungszeichen gesetzt werden, damit ein Parser eine Substitution festlegen kann. Einzelne Anführungszeichen ersetzen nicht, und der obige Code durchsucht die Textzeichenfolge $ SOURCE vom Anfang der $ LIST. Wenn Sie den Anfang des Strings benötigen, ziehen Sie die Länge $ SOURCE ab, z. B. $ {# SOURCE} . Sie können auch schreiben

expr "$LIST" : ".*\($SOURCE\)"

Diese Funktion extrahiert einfach $ SOURCE aus $ LIST und gibt es zurück. Sie erhalten sonst leere Zeichenfolge. Aber sie haben Probleme mit doppelten Anführungszeichen. Ich weiß nicht, wie es aufgelöst wird, ohne die zusätzliche Variable ..__ zu verwenden. Es ist eine leichte Lösung. Sie können also in C schreiben. Es gibt die ready-Funktion strstr . Verwenden Sie keinen expr-Index, also sehr attraktiv. Aber die Indexsuche ist kein Teilstring und nur das erste Zeichen. 

1
Anatoly

Sie können "Index" verwenden, wenn Sie nur ein einzelnes Zeichen suchen möchten, z.

LIST="server1 server2 server3 server4 server5"
SOURCE="3"
if expr index "$LIST" "$SOURCE"; then
    echo "match"
    exit -1
else
    echo "no match"
fi

Ausgabe ist:

23
match
1
Angelo Babudro

expr wird anstelle von [und nicht innerhalb von verwendet, und Variablen werden nur in Anführungszeichen erweitert.

if expr match "$LIST" "$SOURCE"; then

Mir ist nicht wirklich klar, was QUELLE darstellen soll.

Es sieht so aus, als würde Ihr Code ein Muster aus der Standardeingabe lesen und beenden, wenn er mit einem Datenbankalias übereinstimmt. Andernfalls wird "ok" angezeigt. Ist es das was du willst?

0
Mikel

Nun, was ist mit so etwas:

PS3="Select database or <Q> to quit: "
select DB in db1 db2 db3; do
   [ "${REPLY^*}" = 'Q' ] && break
   echo "Should backup $DB..."
done
0