stringContain
バリアント(互換またはケースに依存しない)
これらのスタックオーバーフローの回答は主にBashについて語っているので、この記事の一番下に、ケースに依存しない Bash関数を投稿しました...
とにかく、
互換性のある答え
Bash固有の機能を使用した回答はすでにたくさんあるので、BusyBoxのように、機能の低いシェルで作業する方法があります。
[ -z "${string##*$reqsubstr*}" ]
実際には、これは次のようになります。
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
これはBash、Dash、KornShell(ksh
)、ash(BusyBox)でテストされ、結果は常に次のようになります。
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
1つの機能に
@EeroAaltonenによって尋ねられたように、同じシェルでテストされた同じデモのバージョンは次のとおりです。
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
}
次に:
$ 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'.
通知:引用符や二重引用符をエスケープするか二重に囲む必要があります。
$ 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'.
シンプルな機能
これはBusyBox、Dash、そしてもちろんBashでテストされました:
stringContain() { [ -z "${2##*$1*}" ]; }
次に今:
$ 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
...または、@ Sjlverで指摘されているように、送信された文字列が空の場合、関数は次のようになります。
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
または、AdrianGünterのコメントで示唆されているように、-o
切り替えを回避します。
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
最終(単純)関数:
そして、テストを反転させて、潜在的に高速化します。
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
空の文字列で:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
ケース非依存(Bashのみ!)
大文字と小文字を区別せずに文字列をテストするには、各文字列を小文字に変換します。
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
小切手:
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