test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Você não precisa pedir grep
uma coisa tão simples.
Ou como uma função:
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
Leva 2 ou 3 args. Fornecer mais do que isso distorcerá seus resultados. Você pode usá-lo como:
_occur=0; occur ... . 2 && echo "count: $_occur"
... que imprime a contagem de ocorrências de .
in ...
se ocorrer pelo menos 2 vezes. Como isso:
count: 3
Se $_occur
estiver vazio ou unset
quando for chamado, não afetará nenhuma variável de shell e return
1 se "$2"
ocorrer em "$1"
menos de "$3"
vezes. Ou, se chamado com apenas dois argumentos, será return
1 apenas se "$2"
não estiver dentro "$1"
. Caso contrário, ele retorna 0.
E assim, na sua forma mais simples, você pode fazer:
occur '' . && echo yay || echo shite
... que imprime ...
shite
...mas...
occur . . && echo yay || echo shite
... imprimirá ...
yay
Você também pode escrever um pouco diferente e omitir as aspas $2
na declaração (*"$2"*)
e "${1#*"$2"}"
. Se você fizer isso, poderá usar shell globs para correspondências como sh[io]te
para o teste de correspondência.
...<<<"$line"
. O comandogrep
está esperando um arquivo em vez disso