$STRING1 != "${STRING1/substr/}" unter Linux

$STRING1 != "${STRING1/substr/}" unter Linux

Ich habe eine Zeichenfolge und möchte prüfen, ob sie die Teilzeichenfolge enthält oder nicht. Daher verwende ich diesen Befehl. Unten ist das Linux-Shell-Skript. Ich möchte nur wissen, wie die in der if-Anweisung vorhandene Bedingung funktioniert.

STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
  echo "Substring is present"
fi

Antwort1

Dies ist eine komplizierte und ksh-spezifische (obwohl mittlerweile von einigen anderen Shells unterstützte) Möglichkeit, den Standard zu schreiben:

case $STRING1 in
   *substr*) echo Substring is present
esac

Oder ksh-spezifisch:

if [[ $STRING1 = *substr* ]]; then
  echo Substring is present
fi

${var/pattern/replacement}ist ein KSH-Parametererweiterungsoperator, der auf den Wert von erweitert wird, $varwobei das erste Vorkommen von patterndurch ersetzt wurde replacement.

Also ${STRING1/substr/}wird $STRING1beim ersten Vorkommen substrnichts durch nichts ersetzt, also entfernt.

[[ string = pattern ]]und [[ string != pattern ]]sind eine weitere KSH-spezifische Konstruktion, die Zeichenfolgen mit einem Muster abgleicht. Wenn das Muster in Anführungszeichen steht, wird es wörtlich genommen, ebenso wie [[ string = "string" ]]ein Gleichheitsoperator (und Ungleichheit mit !=).

Der [[ $STRING1 != "${STRING1/substr/}" ]]Befehl gibt also „true“ zurück, wenn die Erweiterung von $STRING1und unterschiedliche Zeichenfolgen ergeben, was nur passieren kann, wenn innerhalb ${STRING!/substr/}von mindestens ein Vorkommen von vorkam. Auf diese Weise kann also überprüft werden, ob enthält .substr$STRING1$STRING1substr

Während weder [[...]]noch Standard- Syntax ${var/pattern/replacement}ist , sind der Befehl und der Operator (letzterer kommt ebenfalls von ksh) Standard. Daher sieht man manchmal Code wie:sh[${var#pattern}

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

Dies ist eine Standardmethode (allerdings keine Bourne-Methode), um zu prüfen, ob eine Variable eine Teilzeichenfolge enthält. Sie ist jedoch wiederum kompliziert und bietet keinen Vorteil gegenüber dem caseAnsatz mit der offensichtlichen Anweisung.

Antwort2

Überprüfen Sie, ob es die Teilzeichenfolge enthält

Scheint einfacher auszuführen

[ -z "${s##*substr*}" ] && echo Substring is present

Das Ergebnis der Erweiterung ${…}ist null (Länge Null), wenn substrvorhanden ist.


... wie die Bedingung in der if-Anweisung funktioniert? Die

if [[ $STRING1 != "${STRING1/substr/}" ]]; then

Vergleicht zwei Zeichenfolgen, die ursprüngliche unveränderte und die gleiche Zeichenfolge, aus substrder entfernt wurde ( /substr/}). Wenn sie unterschiedlich sind ( !=), enthielt die ursprüngliche Zeichenfolge substr.

verwandte Informationen