test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Non è necessario chiamare grep
per una cosa così semplice.
O come una funzione:
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
Ci vogliono 2 o 3 argomenti. Fornire qualcosa di più di questo altera i suoi risultati. Puoi usarlo come:
_occur=0; occur ... . 2 && echo "count: $_occur"
... che stampa il conteggio delle occorrenze di .
in ...
se si verifica almeno 2 volte. Come questo:
count: 3
Se $_occur
è vuoto o unset
quando viene invocato, non avrà alcun effetto sulle variabili shell e return
1 se si "$2"
verifica in "$1"
meno di "$3"
volte. Oppure, se chiamato con solo due argomenti, return
1 sarà solo se "$2"
non è in "$1"
. Altrimenti restituisce 0.
E così, nella sua forma più semplice, puoi fare:
occur '' . && echo yay || echo shite
... che stampa ...
shite
...ma...
occur . . && echo yay || echo shite
... stamperà ...
yay
Potresti anche scriverlo in modo leggermente diverso e omettere le virgolette $2
in entrambe le istruzioni (*"$2"*)
e "${1#*"$2"}"
. Se lo fai, puoi usare i globs di shell per le partite come sh[io]te
per il test delle partite.
...<<<"$line"
. Il comandogrep
prevede invece un file