Antworten:
Sie können das Formular verwenden, ${VAR/subs}
in dem VAR
die größere Zeichenfolge enthalten ist und
subs
die Teilzeichenfolge, die Sie suchen:
my_string=abc
substring=ab
if [ "${my_string/$substring}" = "$my_string" ] ; then
echo "${substring} is not in ${my_string}"
else
echo "${substring} was found in ${my_string}"
fi
Dies funktioniert, weil ${VAR/subs}
gleich ist, $VAR
aber das erste Vorkommen der Zeichenfolge subs
entfernt wird, insbesondere, wenn $VAR
das Wort nicht enthalten ist subs
, wird es nicht geändert.
ab was found in abc
, aber wenn ich benutze, substring=z
bekomme ichz was found in abc
ab is not in abc
. Aber z was found in abc
. Das ist lustig: D
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
Die Klammern sind für den Test, und da es sich um doppelte Klammern handelt, kann es so einige zusätzliche Tests geben =~
.
Sie könnten dieses Formular also so ähnlich verwenden
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
Edit: korrigiert "= ~", hatte gekippt.
fail
mit diesen Parametern:var2="abcd"
[[ $string =~ $substring ]]
. Ich habe die Antwort aktualisiert.
Verwenden von Bash- Dateinamenmustern (auch "Glob" -Muster genannt)
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
Die folgenden zwei Ansätze funktionieren in jeder POSIX-kompatiblen Umgebung, nicht nur in bash:
substr=ab
for s in abc bcd; do
if case ${s} in *"${substr}"*) true;; *) false;; esac; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
substr=ab
for s in abc bcd; do
if printf %s\\n "${s}" | grep -qF "${substr}"; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
Beide der obigen Ausgaben:
'abc' contains 'ab'
'bcd' does not contain 'ab'
Ersteres hat den Vorteil, dass kein separater grep
Prozess gestartet wird.
Beachten Sie, dass ich printf %s\\n "${foo}"
anstelle von verwenden, echo "${foo}"
weil echo
mangeln könnte, ${foo}
wenn es Backslashes enthält.
xrandr
in der Variablen gespeicherten Monitornamen zu finden. +1 und Willkommen bei 1K rep Club :)
Dies ist die portabelste Lösung, die auch auf alten Bourne-Shells und Korn-Shells funktioniert
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
Probelauf:
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
Beachten Sie, dass Sie müssen nicht speziell verwenden echo
Sie verwenden können , exit 1
und exit 0
Erfolg oder Misserfolg zu bedeuten.
Wir könnten auch eine Funktion erstellen (die bei Bedarf in großen Skripten verwendet werden kann) mit bestimmten Rückgabewerten (0 bei Übereinstimmung, 1 bei keiner Übereinstimmung):
$ ./substring_function.sh
ab is substring
$ cat substring_function.sh
#!/bin/sh
is_substring(){
case "$2" in
*$1*) return 0;;
*) return 1;;
esac
}
main(){
if is_substring "ab" "abcdefg"
then
echo "ab is substring"
fi
}
main $@
$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"
it's a substring
Dieser spezielle Ansatz ist bei if-else-Anweisungen in nützlich bash
. Meistens auch tragbar
$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"
it is a substring
$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring
$ ruby -e ' puts "is substring" if ARGV[1].include? ARGV[0]' "ab" "abcdef"
is substring
Beachten Sie die [[
und "
:
[[ $a == z* ]] # True if $a starts with an "z" (pattern matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).
[ $a == z* ] # File globbing and word splitting take place.
[ "$a" == "z*" ] # True if $a is equal to z* (literal matching).
Also, wie @glenn_jackman sagte, aber bedenken Sie, dass, wenn Sie den gesamten zweiten Term in doppelte Anführungszeichen setzen, der Test auf wörtliche Übereinstimmung umgestellt wird .
Ähnlich wie Edwins Antwort, jedoch mit verbesserter Portabilität für posix & ksh und einem Hauch weniger laut als bei Richard:
substring=ab
string=abc
if [ "$string" != "${string%$substring*}" ]; then
echo "$substring IS in $string"
else
echo "$substring is NOT in $string"
fi
string=bcd
if [ "$string" != "${string%$substring*}" ]; then
echo "$string contains $substring"
else
echo "$string does NOT contain $substring"
fi
Ausgabe:
abc contains ab
bcd does NOT contain ab
echo
Aussagen ändern sollten . Weil ich bekommeab is not in abc