test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
grep
Böyle basit bir şey için aramanıza gerek yok .
Veya bir işlev olarak:
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
2 veya 3 argüman alıyor. Bundan daha fazlasını sağlamak sonuçlarını çarpıtacaktır. Gibi kullanabilirsiniz:
_occur=0; occur ... . 2 && echo "count: $_occur"
... meydana gelmesi sayımını yazdırır hangi .
in ...
en az 2 kez meydana gelirse. Bunun gibi, böyle:
count: 3
Eğer $_occur
ikisinden biri boşsa veya unset
o çağrıldığında o zaman hiç hiçbir kabuk değişkenleri etkiler ve olacaktır return
eğer 1 "$2"
oluşur "$1"
daha az "$3"
zaman. Veya, yalnızca iki argüman ile çağrılırsa, sadece içinde return
değilse 1 olacaktır . Aksi takdirde 0 döndürür."$2"
"$1"
Ve böylece, en basit haliyle, şunları yapabilirsiniz:
occur '' . && echo yay || echo shite
... hangi baskılar ...
shite
...fakat...
occur . . && echo yay || echo shite
... yazdıracak ...
yay
Ayrıca farklı bunu biraz yazmak ve çevresindeki tırnak ihmal olabilir $2
hem de (*"$2"*)
ve "${1#*"$2"}"
beyanı. Bunu yaparsanız sh[io]te
, eşleşme testi gibi eşleşmeler için kabuk küre kullanabilirsiniz .
...<<<"$line"
. Komutgrep
bunun yerine bir dosya bekliyor