test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
คุณไม่จำเป็นต้องเรียกgrep
หาสิ่งง่าย ๆ
หรือเป็นฟังก์ชั่น:
occur() while case "$1" in (*"$2"*) set -- \
"${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
(*) return "$((${4:-0}<${3:-1}))";;esac
do : "${_occur:+$((_occur=$4))}";done
ใช้เวลา 2 หรือ 3 args ให้มากกว่าที่จะบิดเบือนผลลัพธ์ คุณสามารถใช้มันเหมือน:
_occur=0; occur ... . 2 && echo "count: $_occur"
... ซึ่งพิมพ์นับการเกิดขึ้นของ.
ใน...
ถ้ามันเกิดขึ้นอย่างน้อย 2 ครั้ง แบบนี้:
count: 3
ถ้า$_occur
ว่างเปล่าหรือunset
เมื่อมันถูกเรียกใช้มันจะไม่มีผลกับตัวแปรเชลล์เลยและreturn
1 ถ้า"$2"
เกิดขึ้นในเวลา"$1"
น้อยกว่า"$3"
นั้น หรือถ้าเรียกว่ามีเพียงสอง args ก็จะreturn
1 เฉพาะในกรณีที่ไม่ได้อยู่ใน"$2"
"$1"
มิฉะนั้นจะส่งคืน 0
ดังนั้นในรูปแบบที่ง่ายที่สุดคุณสามารถ:
occur '' . && echo yay || echo shite
... ที่พิมพ์ ...
shite
...แต่...
occur . . && echo yay || echo shite
... จะพิมพ์ ...
yay
คุณอาจเขียนมันแตกต่างกันเล็กน้อยและละเว้นเครื่องหมายคำพูดรอบ$2
ทั้งใน(*"$2"*)
และ"${1#*"$2"}"
คำสั่ง หากคุณทำเช่นนั้นคุณสามารถใช้เปลือก globs สำหรับการแข่งขันเช่นsh[io]te
สำหรับการทดสอบการแข่งขัน
...<<<"$line"
herestring คำสั่งgrep
คาดว่าจะมีไฟล์แทน