test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Anda tidak perlu menelepon grepuntuk hal yang sangat sederhana.
Atau sebagai fungsi:
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
Dibutuhkan 2 atau 3 argumen. Memberikan lebih dari itu akan membuat hasilnya miring. Anda bisa menggunakannya seperti:
_occur=0; occur ... . 2 && echo "count: $_occur"
... yang mencetak hitungan kemunculan .in ...jika itu terjadi setidaknya 2 kali. Seperti ini:
count: 3
Jika $_occurkosong atau unsetketika dipanggil maka itu tidak akan mempengaruhi variabel shell sama sekali dan return1 jika "$2"terjadi dalam waktu yang "$1"lebih sedikit "$3". Atau, jika dipanggil dengan hanya dua arg, itu returnhanya akan 1 jika "$2"tidak ada "$1". Jika tidak mengembalikan 0.
Jadi, dalam bentuknya yang paling sederhana, Anda dapat melakukan:
occur '' . && echo yay || echo shite
... yang mencetak ...
shite
...tapi...
occur . . && echo yay || echo shite
... akan mencetak ...
yay
Anda mungkin juga menulisnya sedikit berbeda dan menghilangkan tanda kutip $2di kedua bagian (*"$2"*)dan "${1#*"$2"}"pernyataan. Jika Anda melakukannya, Anda dapat menggunakan gumpalan shell untuk pertandingan seperti sh[io]teuntuk tes pertandingan.
...<<<"$line". Perintahnyagrepmengharapkan file sebagai gantinya