ฉันต้องการดูว่าสตริงอยู่ในส่วนของสตริงอื่นหรือไม่
เช่น:
'ab' in 'abc' -> true
'ab' in 'bcd' -> false
ฉันจะทำสิ่งนี้ในเงื่อนไขของสคริปต์ทุบตีได้อย่างไร
ฉันต้องการดูว่าสตริงอยู่ในส่วนของสตริงอื่นหรือไม่
เช่น:
'ab' in 'abc' -> true
'ab' in 'bcd' -> false
ฉันจะทำสิ่งนี้ในเงื่อนไขของสคริปต์ทุบตีได้อย่างไร
คำตอบ:
คุณสามารถใช้แบบฟอร์ม${VAR/subs}
ที่VAR
มีสตริงที่ใหญ่กว่าและ
subs
เป็นสตริงย่อยที่คุณพยายามค้นหา:
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
วิธีนี้ใช้งานได้เพราะ${VAR/subs}
มีค่าเท่ากับ$VAR
แต่เมื่อมีการsubs
ลบสตริงครั้งแรกโดยเฉพาะหาก$VAR
ไม่มีคำที่subs
ไม่ได้แก้ไข
ab was found in abc
แต่ถ้าฉันใช้substring=z
ฉันจะได้รับz was found in abc
ab is not in abc
แล้ว z was found in abc
แต่ นี่เป็นเรื่องตลก: D
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
=~
วงเล็บมีการทดสอบและมันเป็นวงเล็บคู่ก็สามารถดังนั้นบางการทดสอบพิเศษเช่น
ดังนั้นคุณสามารถใช้รูปแบบนี้เช่น
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
แก้ไข:แก้ไข "= ~" ได้พลิกแล้ว
fail
กับพารามิเตอร์นี้:var2="abcd"
[[ $string =~ $substring ]]
ถูกต้องคือ ฉันอัพเดตคำตอบแล้ว
การใช้รูปแบบชื่อไฟล์ทุบตี( รูปแบบ aka "glob")
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
สองวิธีต่อไปนี้จะทำงานบนสภาพแวดล้อมที่เข้ากันได้กับ POSIX ไม่ใช่เฉพาะใน 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
ทั้งเอาต์พุตข้างต้น:
'abc' contains 'ab'
'bcd' does not contain 'ab'
อดีตมีข้อได้เปรียบของการไม่วางไข่grep
กระบวนการแยกต่างหาก
โปรดทราบว่าฉันใช้printf %s\\n "${foo}"
แทนecho "${foo}"
เพราะecho
อาจมีปัญหา${foo}
ถ้ามันมีแบ็กสแลช
xrandr
จอภาพที่เก็บไว้ในตัวแปร +1 และยินดีต้อนรับสู่สโมสรตัวแทน 1K :)
นี่เป็นโซลูชั่นแบบพกพาที่สุดแม้จะใช้กับ Bourne shell และ Korn shell ก็ตาม
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
วิ่งตัวอย่าง:
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
โปรดทราบว่าคุณไม่จำเป็นต้องใช้งานเป็นพิเศษecho
คุณสามารถใช้exit 1
และexit 0
เพื่อบ่งบอกถึงความสำเร็จหรือความล้มเหลว
สิ่งที่เราสามารถทำได้เช่นกันคือสร้างฟังก์ชั่น (ซึ่งสามารถใช้ในสคริปต์ขนาดใหญ่หากจำเป็น) ด้วยค่าส่งคืนเฉพาะ (0 เมื่อจับคู่, 1 โดยไม่มีการจับคู่):
$ ./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
bash
วิธีการนี้โดยเฉพาะอย่างยิ่งจะเป็นประโยชน์กับงบถ้า-อื่นใน ยังพกพาเป็นส่วนใหญ่
$ 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
คำนึงถึง[[
และ"
:
[[ $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).
ดังที่ @glenn_jackman พูด แต่โปรดทราบว่าหากคุณใส่คำที่สองทั้งหมดด้วยเครื่องหมายคำพูดคู่มันจะเปลี่ยนการทดสอบเป็นการจับคู่ตามตัวอักษร
คล้ายกับคำตอบของเอ็ดวิน แต่ด้วยความสะดวกในการพกพาที่ดีขึ้นสำหรับ posix & ksh และมีเสียงรบกวนน้อยกว่าของ 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
เอาท์พุท:
abc contains ab
bcd does NOT contain ab
echo
งบ เพราะฉันได้รับab is not in abc