Câu trả lời:
Bạn có thể sử dụng các hình thức ${VAR/subs}
nơi VAR
chứa chuỗi lớn hơn và
subs
là substring bạn đang cố gắng tìm:
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
Điều này hoạt động vì ${VAR/subs}
bằng $VAR
nhưng với lần xuất hiện đầu tiên của chuỗi subs
bị loại bỏ, đặc biệt nếu $VAR
không chứa từ subs
thì nó sẽ không được sửa đổi.
ab was found in abc
, nhưng nếu tôi sử dụng thì substring=z
tôi nhận đượcz was found in abc
ab is not in abc
. Nhưng z was found in abc
. Điều này thật buồn cười: D
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
dấu ngoặc là dành cho thử nghiệm và vì nó là dấu ngoặc kép, nên có thể một số thử nghiệm bổ sung như thế =~
.
Vì vậy, bạn có thể sử dụng hình thức này một cái gì đó như
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
Chỉnh sửa: đã sửa "= ~", đã lật.
fail
với các thông số này:var2="abcd"
[[ $string =~ $substring ]]
. Tôi cập nhật câu trả lời.
Sử dụng các mẫu tên tệp bash (còn gọi là mẫu "toàn cầu")
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
Hai cách tiếp cận sau đây sẽ hoạt động trên mọi môi trường tương thích POSIX, không chỉ trong 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
Cả hai đầu ra trên:
'abc' contains 'ab'
'bcd' does not contain 'ab'
Cái trước có lợi thế là không sinh ra một grep
quá trình riêng biệt .
Lưu ý rằng tôi sử dụng printf %s\\n "${foo}"
thay echo "${foo}"
vì vì echo
có thể mangle ${foo}
nếu nó chứa dấu gạch chéo ngược.
xrandr
tên màn hình được lưu trong biến. +1 và chào mừng bạn đến câu lạc bộ đại diện 1K :)
Đây là giải pháp di động nhất, sẽ hoạt động ngay cả trên vỏ Bourne cũ và vỏ Korn
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
Chạy mẫu:
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
Lưu ý rằng bạn không phải sử dụng cụ thể echo
bạn có thể sử dụng exit 1
và exit 0
để biểu thị thành công hay thất bại.
Những gì chúng ta có thể làm là tốt, là tạo một hàm (có thể được sử dụng trong các tập lệnh lớn nếu cần thiết) với các giá trị trả về cụ thể (0 trên khớp, 1 không khớp):
$ ./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
Cách tiếp cận cụ thể này rất hữu ích với các câu lệnh if-other trong bash
. Cũng chủ yếu là xách tay
$ 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
Tâm trí [[
và "
:
[[ $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).
Vì vậy, như @glenn_jackman đã nói, nhưng hãy nhớ rằng nếu bạn gói toàn bộ thuật ngữ thứ hai trong dấu ngoặc kép, nó sẽ chuyển bài kiểm tra sang kết hợp theo nghĩa đen .
Tương tự như câu trả lời của edwin, nhưng với tính di động được cải thiện cho posix & ksh, và một liên lạc ít ồn ào hơn 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
Đầu ra:
abc contains ab
bcd does NOT contain ab
echo
tuyên bố. Bởi vì tôi nhận đượcab is not in abc