test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Bạn không cần phải gọi grep
cho một điều đơn giản như vậy.
Hoặc như một chức năng:
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
Phải mất 2 hoặc 3 đối số. Cung cấp nhiều hơn thế sẽ làm lệch kết quả của nó. Bạn có thể sử dụng nó như:
_occur=0; occur ... . 2 && echo "count: $_occur"
... In số lần xuất hiện .
trong ...
nếu nó xảy ra ít nhất 2 lần. Như thế này:
count: 3
Nếu $_occur
là trống hoặc unset
khi nó được gọi thì nó sẽ không ảnh hưởng đến các biến shell và return
1 nếu "$2"
xảy ra "$1"
ít hơn số "$3"
lần. Hoặc, nếu được gọi chỉ với hai đối số, nó sẽ return
chỉ 1 nếu "$2"
không tham gia "$1"
. Khác nó trả về 0.
Và vì vậy, ở dạng đơn giản nhất, bạn có thể làm:
occur '' . && echo yay || echo shite
... mà in ...
shite
...nhưng...
occur . . && echo yay || echo shite
... sẽ in ...
yay
Bạn cũng có thể viết nó một chút khác nhau và bỏ qua các trích dẫn xung quanh $2
trong cả câu lệnh (*"$2"*)
và "${1#*"$2"}"
câu lệnh. Nếu bạn làm điều đó thì bạn có thể sử dụng các khối vỏ cho các trận đấu như sh[io]te
đối với bài kiểm tra trận đấu.
...<<<"$line"
. Lệnhgrep
đang mong đợi một tập tin thay thế