test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
No necesita llamar grepa 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 $_occurestá vacío o unsetcuando se invoca, no afectará a ninguna variable de shell y return1 si "$2"ocurre en "$1"menos de una "$3"vez. O, si se llama con solo dos args, será return1 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 $2en la declaración (*"$2"*)y "${1#*"$2"}". Si haces eso, puedes usar globos de concha para partidos como sh[io]tepara la prueba de partidos.
...<<<"$line". El comandogrepestá esperando un archivo en su lugar