test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Nie musisz dzwonić grep
po 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 $_occur
jest pusty lub unset
gdy zostanie wywołany, nie wpłynie w ogóle na żadne zmienne powłoki, a return
1, jeśli "$2"
wystąpi "$1"
krócej niż "$3"
razy. Lub, jeśli zostanie wywołany tylko z dwoma argumentami, wyniesie return
1 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 $2
zaró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]te
test dopasowania.
...<<<"$line"
.grep
Zamiast tego polecenie oczekuje pliku