stringContain
varyantlar (uyumlu veya büyük / küçük harf bağımsız)
Bu Stack Overflow cevapları çoğunlukla Bash hakkında söylediği gibi, bu yazının en altında bir vakadan bağımsız Bash işlevi yayınladım ...
Her neyse, işte benim
Uyumlu cevap
Bash'e özgü özellikleri kullanan birçok yanıt olduğundan, BusyBox gibi daha kötü özellikli kabuklarda çalışmanın bir yolu var :
[ -z "${string##*$reqsubstr*}" ]
Uygulamada, bu aşağıdakileri verebilir:
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
Bu Bash, Dash , KornShell ( ksh
) ve ash (BusyBox) ve sonuç her zaman:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
Bir işleve
@EeroAaltonen tarafından sorulduğu gibi, aynı demonun aynı kabuklar altında test edilmiş bir versiyonu:
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
}
Sonra:
$ 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'.
Farkına varmak: Tırnaklardan ve / veya çift tırnaklardan kaçmak veya çift tırnak içine almak zorundasınız:
$ 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'.
Basit fonksiyon
Bu BusyBox, Dash ve elbette Bash altında test edildi:
stringContain() { [ -z "${2##*$1*}" ]; }
Öyleyse şimdi:
$ 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
... Veya gönderilen dize @Sjlver tarafından belirtildiği gibi boş olsaydı, işlev şöyle olur:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
ya da Adrian Günter'in yorumunda önerildiği gibi , -o
anahtarlardan kaçınarak :
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Son (basit) fonksiyon:
Ve potansiyel olarak daha hızlı hale getirmek için testleri tersine çevirmek:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Boş dizelerle:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Büyük / küçük harf bağımsız (yalnızca Bash!)
Dizeleri büyük / küçük harf olmadan test etmek için, her dizeyi küçük harfe dönüştürmeniz yeterlidir:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Kontrol:
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