test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
No necesita llamar grep
a algo tan simple.
O como una función:
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
Se necesitan 2 o 3 args. Proporcionar más que eso sesgará sus resultados. Puedes usarlo como:
_occur=0; occur ... . 2 && echo "count: $_occur"
... que imprime el recuento de ocurrencias de .
in ...
si ocurre al menos 2 veces. Me gusta esto:
count: 3
Si $_occur
está vacío o unset
cuando se invoca, no afectará a ninguna variable de shell y return
1 si "$2"
ocurre en "$1"
menos de una "$3"
vez. O, si se llama con solo dos args, será return
1 solo si "$2"
no está en "$1"
. De lo contrario, devuelve 0.
Y así, en su forma más simple, puedes hacer:
occur '' . && echo yay || echo shite
... que imprime ...
shite
...pero...
occur . . && echo yay || echo shite
... imprimirá ...
yay
También puede escribirlo de manera un poco diferente y omitir las comillas $2
en la declaración (*"$2"*)
y "${1#*"$2"}"
. Si haces eso, puedes usar globos de concha para partidos como sh[io]te
para la prueba de partidos.
...<<<"$line"
. El comandogrep
está esperando un archivo en su lugar