test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Anda tidak perlu menelepon grep
untuk 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 $_occur
kosong atau unset
ketika dipanggil maka itu tidak akan mempengaruhi variabel shell sama sekali dan return
1 jika "$2"
terjadi dalam waktu yang "$1"
lebih sedikit "$3"
. Atau, jika dipanggil dengan hanya dua arg, itu return
hanya 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 $2
di kedua bagian (*"$2"*)
dan "${1#*"$2"}"
pernyataan. Jika Anda melakukannya, Anda dapat menggunakan gumpalan shell untuk pertandingan seperti sh[io]te
untuk tes pertandingan.
...<<<"$line"
. Perintahnyagrep
mengharapkan file sebagai gantinya