test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Nie musisz dzwonić greppo tak prostą rzecz.
Lub jako funkcja:
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
Zajmuje 2 lub 3 argumenty. Podanie czegoś więcej wykrzywi jego wyniki. Możesz go używać w następujący sposób:
_occur=0; occur ... . 2 && echo "count: $_occur"
... który wypisuje liczbę wystąpień .w, ...jeśli występuje co najmniej 2 razy. Lubię to:
count: 3
Jeśli $_occurjest pusty lub unsetgdy zostanie wywołany, nie wpłynie w ogóle na żadne zmienne powłoki, a return1, jeśli "$2"wystąpi "$1"krócej niż "$3"razy. Lub, jeśli zostanie wywołany tylko z dwoma argumentami, wyniesie return1 tylko wtedy, gdy "$2"nie ma go "$1". W przeciwnym razie zwraca 0.
I tak w najprostszej formie możesz:
occur '' . && echo yay || echo shite
... które drukuje ...
shite
...ale...
occur . . && echo yay || echo shite
... wydrukuje ...
yay
Możesz także napisać to nieco inaczej i pominąć cudzysłowy $2zarówno w instrukcji, jak (*"$2"*)i "${1#*"$2"}". Jeśli to zrobisz, możesz użyć globów powłoki do dopasowań, takich jak sh[io]tetest dopasowania.
...<<<"$line".grepZamiast tego polecenie oczekuje pliku