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
очікує файлу замість цього