stringContain
Varianten (kompatibel oder fallunabhängig)
In diesen Stack Overflow-Antworten wird hauptsächlich über Bash habe ich eine Fall unabhängig Bash-Funktion ganz unten in diesem Beitrag...
Wie auch immer, hier ist mein
Kompatible Antwort
Da es bereits viele Antworten gibt, die Bash-spezifische Funktionen verwenden, gibt es eine Möglichkeit, unter Shells mit weniger Funktionen zu arbeiten, wie BusyBox :
[ -z "${string##*$reqsubstr*}" ]
In der Praxis könnte sich dies ergeben:
string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'."
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
done
Dies wurde unter Bash getestet, Gedankenstrich , KornShell ( ksh
) und Asche (BusyBox), und das Ergebnis ist immer:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
In einer Funktion
Wie von @EeroAaltonen gewünscht, ist hier eine Version der gleichen Demo, getestet unter den gleichen Shells:
myfunc() {
reqsubstr="$1"
shift
string="$@"
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'.";
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
}
Dann:
$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.
$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
Hinweis: müssen Sie Anführungszeichen und/oder doppelte Anführungszeichen auslassen oder doppelt einschließen:
$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.
$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
Einfache Funktion
Dies wurde unter BusyBox, Dash und natürlich Bash getestet:
stringContain() { [ -z "${2##*$1*}" ]; }
Dann jetzt:
$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
... Oder wenn die übermittelte Zeichenkette leer sein könnte, wie von @Sjlver hervorgehoben, würde die Funktion werden:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
oder wie vorgeschlagen von Kommentar von Adrian Günter und vermeidet -o
Schalter:
stringContain() { [ -z "${2##$1}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Letzte (einfache) Funktion:
Und die Umkehrung der Prüfungen, um sie möglicherweise schneller zu machen:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Mit leeren Saiten:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Fallunabhängig (nur Bash!)
Zum Testen von Zeichenketten ohne Berücksichtigung der Groß- und Kleinschreibung konvertieren Sie einfach jede Zeichenkette in Kleinbuchstaben:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Prüfen:
stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
4 Stimmen
Hallo, wenn leere Zeichenfolgen falsch sind, warum halten Sie es für ungeschickt? Es war der einzige Weg, der für mich funktionierte, trotz der vorgeschlagenen Lösungen.
1 Stimmen
Sie können die
expr
Befehl hier9 Stimmen
Hier ist eine für Posix-Shells: stackoverflow.com/questions/2829613/
2 Stimmen
Bitte verwenden Sie $Nadel in einem $Heuhaufen Idiom in Ihrem Beispiel. Es ist viel einfacher zu lesen und zu verstehen.