stringContain
warianty (kompatybilne lub niezależne od wielkości liter)
Ponieważ te odpowiedzi dotyczące przepełnienia stosu mówią głównie o Bash , na samym dole tego postu opublikowałem niezależną od wielkości funkcję Bash ...
W każdym razie jest mój
Kompatybilna odpowiedź
Ponieważ jest już wiele odpowiedzi za pomocą funkcji specyficznych dla Bash, istnieje sposób działania w słabszych powłokach, takich jak BusyBox :
[ -z "${string##*$reqsubstr*}" ]
W praktyce może to dać:
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
Zostało to przetestowane pod Bash, Dash , KornShell ( ksh
) i ash (BusyBox), a wynik jest zawsze:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
W jedną funkcję
Jak pyta @EeroAaltonen tutaj jest wersja tego samego demo, przetestowana pod tymi samymi powłokami:
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
}
Następnie:
$ 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'.
Uwaga: musisz uciec lub podwójnie dołączyć cudzysłowy i / lub podwójne cudzysłowy:
$ 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'.
Prosta funkcja
Zostało to przetestowane pod BusyBox, Dash i oczywiście Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Więc teraz:
$ 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
... Lub jeśli przesłany ciąg może być pusty, jak wskazał @Sjlver, funkcja wyglądałaby następująco:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
lub jak sugeruje komentarz Adriana Güntera , unikając -o
przełączników:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Ostateczna (prosta) funkcja:
I odwracanie testów, aby były potencjalnie szybsze:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Z pustymi łańcuchami:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Niezależny od wielkości liter (tylko Bash!)
Aby przetestować ciągi bez dbania o wielkość liter, po prostu przekonwertuj każdy ciąg na małe litery:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Czek:
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