test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
このgrep
ような単純なことを呼び出す必要はありません。
または関数として:
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つまたは3つの引数が必要です。それ以上を提供すると、結果が歪められます。次のように使用できます。
_occur=0; occur ... . 2 && echo "count: $_occur"
... 少なくとも2回発生すると.
、in の発生回数を出力し...
ます。このような:
count: 3
場合は、$_occur
どちらか空であるかunset
、それが呼び出されたとき、それは全くのシェル変数には影響しないとされますreturn
場合は1 "$2"
で発生した"$1"
よりも少ない"$3"
回数。または、2つの引数のみで呼び出された場合、にreturn
ない場合のみ1 "$2"
になり"$1"
ます。それ以外の場合は、0を返します。
そのため、最も単純な形式では、次のことができます。
occur '' . && echo yay || echo shite
...印刷する...
shite
...しかし...
occur . . && echo yay || echo shite
...印刷します...
yay
また、少し異なる方法で記述し$2
、(*"$2"*)
and "${1#*"$2"}"
ステートメントの両方で引用符を省略することもできます。その場合sh[io]te
、一致テストのように、一致にシェルグロブを使用できます。
...<<<"$line"
。コマンドは、grep
代わりにファイルを期待している