stringContain
các biến thể (tương thích hoặc trường hợp độc lập)
Vì các câu trả lời Stack Overflow này chủ yếu nói về Bash , tôi đã đăng một hàm Bash độc lập trường hợp ở cuối bài này ...
Dù sao, có của tôi
Câu trả lời tương thích
Vì đã có rất nhiều câu trả lời sử dụng các tính năng dành riêng cho Bash, nên có một cách làm việc dưới các trình bao kém hơn, như BusyBox :
[ -z "${string##*$reqsubstr*}" ]
Trong thực tế, điều này có thể cung cấp cho:
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
Điều này đã được thử nghiệm dưới Bash, Dash , KornShell ( ksh
) và tro (BusyBox) và kết quả luôn là:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
Vào một chức năng
Theo yêu cầu của @EeroAaltonen, đây là một phiên bản của cùng một bản demo, được thử nghiệm dưới cùng một vỏ:
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
}
Sau đó:
$ 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'.
Lưu ý: bạn phải thoát hoặc nhân đôi dấu ngoặc kép và / hoặc dấu ngoặc kép:
$ 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'.
Chức năng đơn giản
Điều này đã được thử nghiệm dưới BusyBox, Dash và dĩ nhiên là Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Ngay sau đó:
$ 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
... Hoặc nếu chuỗi đã gửi có thể trống, như được chỉ ra bởi @Sjlver, hàm sẽ trở thành:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
hoặc như được đề xuất bởi nhận xét của Adrian Günter , tránh các -o
công tắc:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Hàm cuối cùng (đơn giản):
Và đảo ngược các bài kiểm tra để làm cho chúng có khả năng nhanh hơn:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Với các chuỗi trống:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Trường hợp độc lập (chỉ Bash!)
Để kiểm tra các chuỗi mà không cần quan tâm đến trường hợp, chỉ cần chuyển đổi từng chuỗi thành chữ thường:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Kiểm tra:
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