stringContain
หลากหลาย (เข้ากันได้หรือเป็นอิสระกรณี)
เนื่องจากคำตอบ Stack Overflow เหล่านี้ส่วนใหญ่บอกเกี่ยวกับ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'.
เป็นฟังก์ชั่นเดียว
ตามที่ถูกถามโดย @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" ]; }
หรือตามที่แนะนำโดยข้อคิดเห็นของ Adrian Gü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
กรณีเป็นอิสระ (ทุบตีเท่านั้น!)
สำหรับการทดสอบสตริงโดยไม่สนใจขนาดตัวพิมพ์เพียงแปลงแต่ละสตริงเป็นตัวพิมพ์เล็ก:
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