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, $var
wobei das erste Vorkommen von pattern
durch ersetzt wurde replacement
.
Also ${STRING1/substr/}
wird $STRING1
beim ersten Vorkommen substr
nichts 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 $STRING1
und 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
$STRING1
substr
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 case
Ansatz 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 substr
vorhanden 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 substr
der entfernt wurde ( /substr/}
). Wenn sie unterschiedlich sind ( !=
), enthielt die ursprüngliche Zeichenfolge substr
.