test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Sie müssen nicht nach grepso 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 $_occurleer ist oder unsetwenn es aufgerufen wird, wirkt es sich überhaupt nicht auf Shell-Variablen aus und return1, wenn "$2"es "$1"weniger als "$3"einmal auftritt . Oder, wenn mit nur zwei Argumenten aufgerufen, wird return1 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 $2in der beide (*"$2"*)und "${1#*"$2"}"Aussage. Wenn Sie das tun, können Sie Shell-Globs für Matches wie sh[io]tefür den Match-Test verwenden.
...<<<"$line". Der Befehlgreperwartet stattdessen eine Datei