test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Sie müssen nicht nach grep
so einer einfachen Sache rufen .
Oder als Funktion:
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
Es dauert 2 oder 3 Argumente. Wenn Sie mehr als das bereitstellen, werden die Ergebnisse verzerrt. Sie können es wie folgt verwenden:
_occur=0; occur ... . 2 && echo "count: $_occur"
... der die Häufigkeit von .
in ...
ausgibt, wenn sie mindestens zweimal auftritt. So was:
count: 3
Wenn $_occur
leer ist oder unset
wenn es aufgerufen wird, wirkt es sich überhaupt nicht auf Shell-Variablen aus und return
1, wenn "$2"
es "$1"
weniger als "$3"
einmal auftritt . Oder, wenn mit nur zwei Argumenten aufgerufen, wird return
1 nur, wenn "$2"
nicht in ist "$1"
. Anderenfalls wird 0 zurückgegeben.
In seiner einfachsten Form können Sie also Folgendes tun:
occur '' . && echo yay || echo shite
... was druckt ...
shite
...aber...
occur . . && echo yay || echo shite
... wird gedruckt ...
yay
Man könnte es auch ein wenig anders schreiben und die Anführungszeichen weglassen um $2
in der beide (*"$2"*)
und "${1#*"$2"}"
Aussage. Wenn Sie das tun, können Sie Shell-Globs für Matches wie sh[io]te
für den Match-Test verwenden.
...<<<"$line"
. Der Befehlgrep
erwartet stattdessen eine Datei