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 аргумента. Предоставление большего, чем это, искажает его результаты. Вы можете использовать его как:
_occur=0; occur ... . 2 && echo "count: $_occur"
... который печатает число вхождений .
в, ...
если это происходит по крайней мере 2 раза. Нравится:
count: 3
Если $_occur
пусто или unset
когда оно вызывается, то это не повлияет на переменные оболочки вообще и return
1, если "$2"
происходит "$1"
меньше, чем "$3"
раз. Или, если вызывается только с двумя аргументами, он будет равен return
1, только если "$2"
его нет "$1"
. В противном случае возвращается 0.
И так, в простейшем виде вы можете сделать:
occur '' . && echo yay || echo shite
... который печатает ...
shite
...но...
occur . . && echo yay || echo shite
... напечатает ...
yay
Вы также можете написать его немного по- другому и опускать кавычки $2
в обоих (*"$2"*)
и "${1#*"$2"}"
заявления. Если вы сделаете это, то вы можете использовать оболочки оболочки для совпадений, например, sh[io]te
для теста совпадения.
...<<<"$line"
. Командаgrep
ожидает файл вместо этого