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